XSLT 按索引获取节点



我是XSLT的初学者,我正在使用它将XML转换为XML

这是我收到的源 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:

<?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,它应该具有值2

请帮忙。谢谢。

这是一个相对简单的解决方案。

当此 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>
<?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>
<?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>

相关内容

  • 没有找到相关文章

最新更新