4

我是 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

请帮忙。谢谢。

4

3 回答 3

5

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

当这个 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>
于 2012-11-28T14:56:04.270 回答
2
<?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>
于 2012-11-28T14:53:48.577 回答
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>
于 2012-11-30T13:40:51.187 回答