2015-01-14 3 views
3

XSL 변수에 XPath 표현식을 표현 (또는 다른 기술을 사용)하고 그 저장된 표현식을 여러 개의 XSLT 선택 매개 변수로 사용하고 싶습니다. (XPath 표현식은 복잡하고 한 곳에서 정의/유지하려고합니다.)XPath의 변수가 코드 중복을 피하기 위해 선택했습니다.

XSL 1.0을 사용하는 msxsl을 사용하고 있습니다.

다음 예제 코드에서는 "@ attr1! = 'aaa'및 @ attr1! = 'bbb'"중복을 피하고자합니다. 여기

<?xml version="1.0" encoding="UTF-8" ?> 
<xsl:transform xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="1.0"> 
    <xsl:output method="xml" omit-xml-declaration="yes" encoding="UTF-8" indent="yes" /> 

    <xsl:template match="/"> 
    <results> 
     <xsl:for-each select="//node[@attr1 != 'aaa' and @attr1 != 'bbb']"> 
      <result-node parent="AAA"> 
       <xsl:value-of select="@value"/> 
      </result-node> 
     </xsl:for-each> 

     <xsl:for-each select="//node[@attr1 != 'aaa' and @attr1 != 'bbb']"> 
      <result-node parent="BBB"> 
       <xsl:value-of select="@value"/> 
      </result-node> 
     </xsl:for-each> 
    </results> 
    </xsl:template> 

</xsl:transform> 

위의 코드를 처리 할 때 출력 다음 샘플 XML이다.

XML :

<root> 
    <AAA> 
     <node attr1="aaa" value="1"/> 
     <node attr1="bbb" value="2"/> 
     <node attr1="ccc" value="3"/> 
     <node attr1="ddd" value="4"/> 
    </AAA> 
    <BBB> 
     <node attr1="aaa" value="5"/> 
     <node attr1="bbb" value="6"/> 
     <node attr1="ccc" value="7"/> 
     <node attr1="ddd" value="8"/> 
    </BBB> 
</root> 

출력 : 식 평가의

<results> 
    <result-node parent="AAA">3</result-node> 
    <result-node parent="AAA">4</result-node> 
    <result-node parent="AAA">7</result-node> 
    <result-node parent="AAA">8</result-node> 
    <result-node parent="BBB">3</result-node> 
    <result-node parent="BBB">4</result-node> 
    <result-node parent="BBB">7</result-node> 
    <result-node parent="BBB">8</result-node> 
</results> 
+0

질문에 입력 XML뿐만 아니라 예상 한 결과를 추가하십시오. 변수에 XPath 표현식을 저장하는 것이 필요하지 않을 수도 있습니다 - 우리는 [실제로 무엇을 성취하려고하는지 알고 있어야합니다.] (http://meta.stackexchange.com/questions/66377/what-is-the- xy- 문제). –

+0

http://xsltransform.net/6qVRKw6/2 –

답변

2

변수 저장 결과 -가 아니라 표현 자체를.

는 코드 중복을 피하고의 목표를 달성 만드는 것이 좋습니다하려면 필터링 된 노드 집합 다음 서브 세트를 선택 조건을 적용, 첫째 - 예 :

<xsl:variable name="my-set" select= "node[@attr1!='aaa' and @attr1!='bbb']" /> 

과 :

<xsl:for-each select="$my-set[parent::AAA]"> 
+0

안녕하세요. Michael, 잠시 노력했지만 작동하지 못했습니다. 왜 그런지 모르겠다. 부모처럼 보였다 :: 그냥 작동하지 않았다. 이전 질문이 명확하지 않은 경우에 대비하여 내가하고 싶은 것을 더 정확하게 보여주기 위해 완전히 기능하는 코드로 내 질문을 편집했습니다. –

+0

@CaptainNormal 나는 이미 당신에게 질문에 대한 코멘트로서 : http://xsltransform.net/6qVRKw6/2의 마이클 솔루션에 대한 완전한 예제를 보냈다. 템플릿을 호출 할 필요가 전혀 없습니다. –

+0

안녕하세요. Mathias, 당신 (그리고 Michael)은 완벽합니다. 저는 원래의 질문과 일치시키고 당신의 훌륭한 예와 일치시키기 위해 질문을 다시 조정했습니다. 현재의 문제는 여전히 100 % 해결되지 않았지만 나머지 문제는 주제와 다르기 때문에 별도로 게시하겠습니다. 고맙습니다. –

관련 문제