2012-11-28 3 views
2

에 의해 노드를 얻고 난이 소스 XML이다 XMLXSLT 내가 XSLT에서 초보자입니다 색인

에 XML을 변환하는 데 사용하고

소스 XML :

<Response> 
    <Pax> 
     <Id>1</Id> 
    </Pax> 
    <Pax> 
     <Id>2</Id> 
    </Pax> 
    <Travelers> 
     <Traveler> 
      <Name>ABC</Name> 
     </Traveler> 
     <Traveler> 
      <Name>XYZ</Name> 
     </Traveler> 
    </Travelers> 
</Response> 

XSLT 아래에 작성했습니다.

XSLT :

(210)
<?xml version="1.0" encoding="UTF-8"?> 
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" 
version="1.0"> 

    <xsl:output method="xml" indent="yes" /> 

    <xsl:template match="Response"> 
     <xsl:element name="Root"> 
       <xsl:apply-templates select="Travelers/Traveler"/> 
     </xsl:element> 
    </xsl:template> 

    <xsl:template match="Traveler"> 
      <xsl:element name="Person"> 
      <xsl:element name="PId"> 
        <xsl:value-of select="//Pax/Id[position()]" /> 
      </xsl:element> 
      <xsl:element name="Name"> 
        <xsl:value-of select="Name" /> 
      </xsl:element> 
      </xsl:element> 
    </xsl:template> 
</xsl:stylesheet> 

출력 :

<Root> 
    <Person> 
    <PId>1</PId> 
    <Name>ABC</Name> 
    </Person> 
    <Person> 
    <PId>1</PId> 
    <Name>XYZ</Name> 
    </Person> 
</Root> 

내가 XML 출력 이하로 생성하고자하는

예상 출력 :

<Root> 
    <Person> 
    <PId>1</PId> 
    <Name>ABC</Name> 
    </Person> 
    <Person> 
    <PId>2</PId> 
    <Name>XYZ</Name> 
    </Person> 
</Root> 

유일한 문제는 위의 XML에 나타낸 바와 같이 PId 인 경우 값이여야합니다..

도와주세요. 감사.

답변

4

다음은 비교적 간단한 해결책입니다.

이 XSLT 경우 :

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

    <xsl:template match="/*"> 
    <Root> 
     <xsl:apply-templates select="Pax" /> 
    </Root> 
    </xsl:template> 

    <xsl:template match="Pax"> 
    <xsl:variable name="vPosition" select="position()" /> 
    <Person> 
     <PId> 
     <xsl:value-of select="Id" /> 
     </PId> 
     <Name> 
     <xsl:value-of select="/*/Travelers/*[$vPosition]/Name" /> 
     </Name> 
    </Person> 
    </xsl:template> 
</xsl:stylesheet> 

이 ... 원래 XML에 적용됩니다

<Response> 
    <Pax> 
    <Id>1</Id> 
    </Pax> 
    <Pax> 
    <Id>2</Id> 
    </Pax> 
    <Travelers> 
    <Traveler> 
     <Name>ABC</Name> 
    </Traveler> 
    <Traveler> 
     <Name>XYZ</Name> 
    </Traveler> 
    </Travelers> 
</Response> 

... 원하는 결과가 생성됩니다

<Root> 
    <Person> 
    <PId>1</PId> 
    <Name>ABC</Name> 
    </Person> 
    <Person> 
    <PId>2</PId> 
    <Name>XYZ</Name> 
    </Person> 
</Root> 
+0

수정하십시오. 보통 이러한 속성을 가진 경우'current()', 즉'Pax/Id [@ id = current()/@ id]'를 사용하여이 문제를 회피 할 수 있습니다. 그러나'position()'과'current()'를 조합 할 수없고 변수를 사용해야합니다. –

+0

@NilsWerner - 정확합니다. – ABach

+0

@ 표지 - 감사합니다. 이미 지정된 XPath는 틀린가? –

1
<?xml version="1.0" encoding="UTF-8"?> 
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="1.0"> 
    <xsl:output method="xml" indent="yes" /> 
    <xsl:template match="Response"> 
    <Root> 
     <xsl:for-each select="Travelers/Traveler"> 
     <Person> 
      <xsl:variable name="index" select="position()" /> 
      <Pid><xsl:value-of select="//Pax[$index]/Id"/></Pid> 
      <Name><xsl:value-of select="Name"/></Name> 
     </Person> 
     </xsl:for-each> 
    </Root> 
    </xsl:template> 
</xsl:stylesheet> 
0
<?xml version="1.0" encoding="UTF-8"?> 
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="1.0"> 
    <xsl:output method="xml"/> 
    <xsl:template match="/Response"> 
     <Root> 
      <xsl:for-each select="Pax"> 
       <xsl:variable name="pos" select="position()"/> 
       <Person> 
        <PId> 
         <xsl:value-of select="Id"/> 
        </PId> 
        <xsl:apply-templates select="//Travelers"> 
         <xsl:with-param name="pos" select="$pos"/> 
        </xsl:apply-templates> 
       </Person> 
      </xsl:for-each> 
     </Root> 
    </xsl:template> 
    <xsl:template match="Travelers"> 
     <xsl:param name="pos"/> 
     <xsl:for-each select="//Name"> 
      <xsl:if test="position()=$pos"> 
       <xsl:copy-of select="."/> 
      </xsl:if> 
     </xsl:for-each> 
    </xsl:template> 
</xsl:stylesheet> 
관련 문제