2016-08-20 3 views
1

특정 속성 (예 : @test)을 가진 모든 요소에 대해 속성을 정의하는 방법에 관계없이 초기에 유형 스위치를 실행하려고합니다. 이것은 내가 XQL 파일에 지금까지 무엇을 가지고 :Typeswitch 대소 문자 속성()?

declare function tei2:tei2html($nodes as node()*) { 
 
    for $node in $nodes 
 
    return 
 
     typeswitch ($node) 
 
      case attribute(test) return 
 
       <b>{ tei2:tei2html($node/node()) }</b> 
 
};

나는 xml 파일 <p test="test">에서 테스트 속성을 작성했지만 아무 반응이 없습니다 - 나는 <p> 굵게 될 것을 기대하고 있었다. 내가 뭘 놓치고 있니? 이것이 가능합니까 아니면 속성을 CSS 클래스로 변형하는 함수를 만드는 것이 더 좋을까요?

업데이트 된 질문은

나는 tei2html.xql이 typeswitch을 추가 한, 그것은 일종의하지만 확실히, 내가 원하는 않습니다.

case element(tei:div) return 
      <p> 
       { 
        if ($node/@type="subhead") then 
         attribute class {$node/@type="subhead"} 
        else 
         () 
        , 
        tei2:tei2html($node/node()) 
       } 
      </p> 

결과는 다음과 같습니다 : 여기

는 새로운 코드입니다. "진정한"그래서

<p class="true">SECT. II.</p> 

, 대신에이 속성을 추가 할 것 "부제"속성을 추가하는 무슨 일 이니?

은 내가 바보 새 해요 질문

업데이트] 업데이트되었습니다. typeschitch 줄을 다음과 같이 변경하여 문제를 해결했습니다.

attribute class {$node/@type="subhead"} 

완료!

+0

대부분의 경우 요소를 켜고이 경우 속성을 확인하려고합니다. – adamretter

답변

0

$ node가 속성 인 경우 자식이 없기 때문에 $node/node()은 아무 것도 선택하지 않습니다. 당신이 tei2:tei2html() 기능에 <p test="test"> 요소를 통과 할 때 무슨 일을 통해

0

하자의 작품은 :

  1. 기능은 $nodes 매개 변수로 <p> 요소를받습니다.
  2. FLWOR는 $nodes을 반복하며 각각에 $node을 할당합니다. 첫 번째 반복에서 $node<p> 요소입니다.
  3. typeswitch 식은 $node을보고 특성인지 확인합니다. <p>은 속성이 아니므로 다음 테스트로 넘어갑니다. 더 이상의 테스트가 없으면 여기에 제시되지 않은 기본값을 반환합니다. 사실 default 표현이 없으므로 제시된 코드에 오류가 나타납니다.).
  4. defaultreturn() 인 경우 표현식이 0으로 종료됩니다.
  5. defaultreturn tei:tei2html($node/node()) 인 경우 <p test="test">의 자식 노드 즉, @test 특성에 대한 함수가 다시 호출됩니다.이번에는 속성 테스트가 작동하지만 빈 <b> 요소를 반환합니다. Michael이 말한 것처럼 $node이 속성 인 경우 $node/node()은 속성에 하위 항목이 없으므로 아무 것도 선택하지 않습니다.

일반적으로 재귀 적 유형 전환 변환에서 우리는 Adam이 제안한 것처럼 요소 처리 과정에서 속성을 처리합니다.

declare function tei2:tei2html($nodes as node()*) { 
    for $node in $nodes 
    return 
     typeswitch ($node) 
      case element(p) return 
       <p> 
        { 
         if ($node/@test) then 
          attribute class {$node/@test} 
         else 
          () 
         , 
         tei2:tei2html($node/node()) 
        } 
       </p> 
      default return tei2:tei2html($node/node()) 
}; 

<p class="test"><p test="test"> 변환합니다.

attribute() 테스트에서 불법적 인 것은 없지만 실제로는 처리가 부모 요소와 밀접한 관계가 있으므로 대부분의 경우 반복적 인 유형 전환은 부모 요소를 처리하는 과정에서 특성을 처리합니다.

+0

Joe, 매우 도움이됩니다. 시간을내어 철저히 설명해 주셔서 감사합니다! 나는 이것을 통해 일할 것이고, 그것이 나를 필요로하는 곳을 볼 것이다. 고맙습니다! –