2014-08-29 3 views
1

내가 일하고있는 프로젝트에서 som XSLT 코드의 리팩토링에 관한 문제가 있습니다. XSLT 지금어떻게이 XSLT를 리펙토링 할 수 있습니까?

<pdf:sometext text="{$metadata/namespace:template 
        /namespace:template_collection 
        //namespace:option 
        [namespace:identificator 
         = $report_option_identifier] 
        /namespace:name}"/> 

이 문제는 XSLT이 (slighty를 변경 네임 스페이스와 약간 변경 태그의 origianl XML의 새 버전) 이상의 노드에 충돌하도록 확장 될 필요가 있다는 점이다.

는이 코드를 내놓았다 :

<xsl:variable name="report_template_collection" 
       select="$metadata 
         /namespace:template 
         /namespace:template_collection 
         | 
         $metadata 
         /namespace2:templateV2 
         /namespace2:template_collectionV2" /> 
<xsl:variable name="current_report_option" 
       select="namespace:option | namespace2:optionV2" /> 
<xsl:variable name="incomplete_report_option_text" 
       select="$report_template_collection 
         //$current_report_option 
         [namespace:identificator 
         = $report_option_identifier] 
         /namespace:name"/> 

<pdf:sometext text="{$incomplete_report_option_text}"/> 

그러나 컴파일 할 때이 THS 오류와 함께 제공 :

Unexpected token '$' in the expression. $report_template_collection// -->$<-- current_report_option[namespace:opt...

그래서 내 질문은 : 어떻게을 설명 할 수있는 XSLT를 리팩토링 수 있습니다 새로운 이름 (V2) 및 다른 네임 스페이스. 동일한 XSLT가 XML의 모든 버전 (이전 버전과 새 버전 모두)을 준수해야합니다.

미리 감사드립니다.

+3

귀하의 질문이 지금처럼 확실히 대답 할 수없는 것입니다. 이 모든 변수의 목적은 무엇입니까? 다른 버전의 XML 입력을 언급했지만 아무 것도 표시하지 않습니다. 질문을 편집하고 다음을이 순서대로 표시 할 것을 권장합니다. 목표가 무엇인지, 무엇이 잘못되었는지, _full_, 문제가있는 최소한의 XSLT 스타일 시트, XML 입력 및 기대하는 XML 출력을 설명하는 문장. –

+0

오류 메시지는'select' 속성 중 하나의 값이 XPath 표현식이 아니라는 것을 알려줍니다. 당신의 문제는 표현의 일부분입니다 ...'// $ current_report_option' ... - 오직 당신이 거기서 말하려고했던 것을 알고 있기 때문에 그것을 고칠 수 있습니다. –

답변

0

xpath 표현식에서 수행 한 작업에서 $current_report_option을 참조 할 수 없습니다. 매크로처럼 XSLT 변수를 사용할 수 없습니다. 이는 사용자가하려는 것으로 나타납니다. $current_report_option 유형은 노드 집합입니다.

난 당신이 (잘못) $current_report_option를 사용하려는 방법에 올바르게 의도를 해석하는 경우, 대신 다음과 같은 일을 수행해야합니다

<xsl:variable name="incomplete_report_option_text" 
       select="$report_template_collection 
         //*[self::namespace:option or 
          self::namespace2:optionV2] 
         [namespace:identificator 
         = $report_option_identifier] 
         /namespace:name"/> 

을 나는 확인을위한 노드 테스트와 $current_report_option의 사용량을 대체 이전 또는 새 옵션 노드 유형.

1

형태가 A/B/$C 인 XPath 표현식은 XPath 2.0에서는 실제로 유효하지만 XPath 1.0에서는 유효하지 않습니다. 그러나 아마도 그것이 당신이 생각하는 것을 의미하지는 않습니다. @ewh와 마찬가지로 나는 변수 $C이 표현식 D|E에 바인드 된 경우 A/B/$CA/B/(D|E)을 쓰는 또 다른 방법이라고 상상한다는 것을 의심하지 않습니다. 그것은 사실이 아닙니다. $C은 표현식이 아닌 값 (노드 시퀀스)에 바인딩됩니다.

는 대신 변수의 기능을 사용할 수 있습니다

<xsl:function name="f:current_report_option"> 
    <xsl:param name="node" as="node()"/> 
    <xsl:sequence select="$node/(D|E)"/> 
</xsl:function> 

<xsl:variable name="X" select="A/B/f:current_report_option(.)"/> 
관련 문제