输入:
<root>
<trip>
<ID>3295</ID>
<ordini>
<NR>821321</NR>
<!-- some info -->
</ordini>
<ordini>
<NR>234</NR>
<!-- some info -->
</ordini>
</trip>
<trip>
<ID>23</ID>
<ordini>
<NR>2321</NR>
<!-- some info -->
</ordini>
<ordini>
<NR>999</NR>
<!-- some info -->
</ordini>
<ordini>
<NR>232132131</NR>
<!-- some info -->
</ordini>
</trip>
</root>
XSL:
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
version="1.0">
<xsl:output method="xml" indent="yes" />
<xsl:template match="@*|node()">
<xsl:copy>
<xsl:apply-templates/>
</xsl:copy>
</xsl:template>
<xsl:template name="set-row">
<xsl:param name="runningtot"/>
<xsl:param name="node"/>
<xsl:value-of select="$runningtot + 1"/>
<xsl:if test="$node/following-sibling::ordini">
<xsl:call-template name="set-row">
<xsl:with-param name="runningtot" select="$runningtot + 1"/>
<xsl:with-param name="node" select="$node/following-sibling::ordini[1]"/>
</xsl:call-template>
</xsl:if>
</xsl:template>
<xsl:template match="ordini">
<xsl:for-each select="//ordini">
<ordini>
<NR>
<xsl:call-template name="set-row">
<xsl:with-param name="runningtot" select="0"/>
<xsl:with-param name="node" select="ordini"/>
</xsl:call-template>
</NR>
<xsl:apply-templates/>
</ordini>
</xsl:for-each>
</xsl:template>
</xsl:stylesheet>
所需的输出:
<root>
<trip>
<ID>3295</ID>
<ordini>
<NR>1</NR>
<!-- some info -->
</ordini>
<ordini>
<NR>2</NR>
<!-- some info -->
</ordini>
</trip>
<trip>
<ID>23</ID>
<ordini>
<NR>1</NR>
<!-- some info -->
</ordini>
<ordini>
<NR>2</NR>
<!-- some info -->
</ordini>
<ordini>
<NR>3</NR>
<!-- some info -->
</ordini>
</trip>
</root>
基本上,我想为每个“ ordini”标签替换“ NR”标签,在这里我从1开始并递增地递增父“ trip”标签中的每个“ ordini”标签。 在此看到带有参数答案的模板,该模板用于重复的增量计数,但我无法使其正常工作。
谢谢您的时间。
答案 0 :(得分:1)
您有一个与ordini
相匹配的模板,但是随后您去选择了文档中的所有ordini
元素(正是//ordini
所选择的元素)。
在这种情况下,有一种比使用set-row
模板简单得多的解决方案。只需使用xsl:number
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="1.0">
<xsl:output method="xml" indent="yes" />
<xsl:template match="@*|node()">
<xsl:copy>
<xsl:apply-templates/>
</xsl:copy>
</xsl:template>
<xsl:template match="ordini">
<ordini>
<NR>
<xsl:number />
</NR>
<xsl:apply-templates/>
</ordini>
</xsl:template>
</xsl:stylesheet>