如何为多个identic元素

时间:2017-01-30 14:41:04

标签: xml xslt

我正在搜索为多个孩子设置相同ID的方法。我在XSL中做到了这一点:



<xsl:template match="ref">
  <fields>
    <field name="" value=""/>
  </fields>
</xsl:template>
&#13;
&#13;
&#13;

我用XML获取它

&#13;
&#13;
<refs>
    <ref alias="">
        <fields>
            <field name="something" value="something" />
            <field name="something" value="something" />
         </fields>
    </refs>
    <ref>
         <fields>
              <field name="something" value="something"/>
              <field name="something" value="something"/>

         </fields>
</ref>
</refs>
&#13;
&#13;
&#13;

我最后想要这个

&#13;
&#13;
<refs>
    <ref alias="">
        <fields>
            <field name="something" value="something" index="0"/>
            <field name="something" value="something" index="0"/>
         </fields>
         </refs>
          <ref>
         <fields>
              <field name="something" value="something" index="1"/>
              <field name="something" value="something" index="1"/>
         </fields>
    </ref>
</refs>
&#13;
&#13;
&#13;

我该如何处理?

1 个答案:

答案 0 :(得分:0)

我会这样做:

XSLT 1.0

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

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

<xsl:template match="field">
    <xsl:copy>
        <xsl:copy-of select="@*"/>
        <xsl:attribute name="index">
            <xsl:value-of select="generate-id(..)" />
        </xsl:attribute>
    </xsl:copy>
</xsl:template>

</xsl:stylesheet>

这会为每个field分配其父fields的唯一ID。 id的确切格式取决于处理器。