我正在尝试创建一个函数,按顺序为 xml 元素分配一个数字。让我举一个例子。我想要的输出 xml 是这样的:
<Item>
<ZDoc>
<seq>1</seq>
</ZDoc>
<ZDoc>
<seq>2</seq>
</ZDoc>
<TDoc>
<seq>1</seq>
</TDoc>
<TDoc>
<seq>2</seq>
</TDoc>
</Item>
<Item>
<ZDoc>
<seq>1</seq>
</ZDoc>
<ZDoc>
<seq>2</seq>
</ZDoc>
<TDoc>
<seq>1</seq>
</TDoc>
<TDoc>
<seq>2</seq>
</TDoc>
</Item>
我创建了这个功能:
<xsl:template name="my_func()">
<xsl:param name="id_name" select="''"/>
<!-- Count elements -->
<xsl:variable name="seq" select="count(//*[local-name() = $global-id]) + 1"/>
<!-- Output the generated sequence number -->
<xsl:value-of select="$seq"/>
</xsl:template>
但它只返回sequenceNumber 1。正如你所见,id_name 是节点名称,如 TDoc 和 ZDoc。 输出是这样的:
<Item>
<ZDoc>
<seq>1</seq>
</ZDoc>
<ZDoc>
<seq>2</seq>
</ZDoc>
<TDoc>
<seq>1</seq>
</TDoc>
<TDoc>
<seq>1</seq>
</TDoc>
</Item>
<Item>
<ZDoc>
<seq>1</seq>
</ZDoc>
<ZDoc>
<seq>1</seq>
</ZDoc>
<TDoc>
<seq>1</seq>
</TDoc>
<TDoc>
<seq>1</seq>
</TDoc>
</Item>
我尝试了另一种方法,似乎效果更好,但它再次从最后一个元素中的 2 开始计数
<xsl:template name="my_func()">
<xsl:param name="id" select="()"/>
<xsl:variable name="auto_number" as="xs:integer" select="position() "/>
<xsl:sequence select="xs:integer($auto_number)"/>
</xsl:template>
但知道输出是这样的:
<Item>
<ZDoc>
<seq>1</seq>
</ZDoc>
<ZDoc>
<seq>2</seq>
</ZDoc>
<TDoc>
<seq>2</seq>
</TDoc>
<TDoc>
<seq>3</seq>
</TDoc>
</Item>
<Item>
<ZDoc>
<seq>1</seq>
</ZDoc>
<ZDoc>
<seq>2</seq>
</ZDoc>
<TDoc>
<seq>2</seq>
</TDoc>
<TDoc>
<seq>3</seq>
</TDoc>
</Item>
<seq>
<xsl:call-template
name="my_func">
<xsl:with-param name="id"
select="'TDoc'" as="item()"/>
</xsl:call-template>
</seq>
我缺少什么?有什么想法吗??
要计算节点数,我建议使用
xsl:number
。
此外,您还没有创建函数,您已经创建了命名模板。在 XSLT 2.0+ 中,有实际的函数 (
xsl:function
),因此正确使用术语非常重要。
我不确定您使用的是哪个版本的 XSLT,所以这是一个 1.0 示例...
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output indent="yes"/>
<xsl:strip-space elements="*"/>
<xsl:template match="@*|node()">
<xsl:copy>
<xsl:apply-templates select="@*|node()"/>
</xsl:copy>
</xsl:template>
<xsl:template match="ZDoc|TDoc">
<xsl:copy>
<Seq><xsl:call-template name="get_seq"/></Seq>
</xsl:copy>
</xsl:template>
<xsl:template name="get_seq">
<xsl:variable name="to_count" select="name()"/>
<xsl:number from="Item" count="*[name()=$to_count]"/>
</xsl:template>
</xsl:stylesheet>