使用xslt重命名具有固定节点值的增量节点

时间:2017-02-09 23:15:15

标签: xml xslt xpath xslt-1.0

我希望使用xslt 1.0从输入xml获得低于输出的值。你能否建议一种方法来做到这一点。

    Input xml:
    <result>
      <item0>
        <Name>Customer1</Name>
        <location>1360190</location>
      </item0>
     <item1>
       <Name>Customer2</Name>
      <location>1360190</location>
    </item1>
  </result>

     Output xml:
      <result>
        <item>
          <Name>Customer1</Name>
          <location>1360190</location>
        </item>
        <item>
          <Name>Customer2</Name>
          <location>1360190</location>
        </item>
      </result>

1 个答案:

答案 0 :(得分:0)

正如@LingamurthyCS所提到的,考虑使用Identity Transform和模板重命名<item>节点,使用各种XPath 匹配引用,如下所示:

在子元素上使用结果引用和 apply-templates

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

  <!-- Identity Transform -->
  <xsl:template match="@*|node()">
    <xsl:copy>
      <xsl:apply-templates select="@*|node()"/>
    </xsl:copy>
  </xsl:template>

  <xsl:template match="result/*">
    <item>
      <xsl:apply-templates select="*"/>
    </item>
  </xsl:template>               

</xsl:transform>

在子元素上没有结果引用和副本

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

  <!-- Identity Transform -->
  <xsl:template match="@*|node()">
    <xsl:copy>
      <xsl:apply-templates select="@*|node()"/>
    </xsl:copy>
  </xsl:template>

  <xsl:template match="/*/*">
    <item>
      <xsl:copy-of select="*"/>
    </item>
  </xsl:template>               

</xsl:transform>

使用项目参考:

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

  <!-- Identity Transform -->
  <xsl:template match="@*|node()">
    <xsl:copy>
      <xsl:apply-templates select="@*|node()"/>
    </xsl:copy>
  </xsl:template>

  <xsl:template match="*[contains(name(), 'item')]">
    <item>
      <xsl:apply-templates />
    </item>
  </xsl:template>               

</xsl:transform>