我一直在寻找解决方案,我只是找不到答案。我希望有人可以提供帮助。这是我的问题:
我正在尝试计算名为referenceID
的元素数量及其在组内的位置,类似于this,所以这是我的文件:
<file>
<group id = "1">
<title/>
<para>
<referenceID ref="123"/>
</para>
<title>
<note>
<referenceID ref="001"/>
</note>
</title>
</group>
<group id = "2">
<para>
<note>
<referenceID ref="222"/>
</note>
</para>
</group>
</file>
我正在尝试添加ref
属性,以便显示referenceID
的组位置,无论深度如何,因此我的输出文件如下:
<file>
<group id = "1">
<title/>
<para>
<referenceID ref="123-1"/>
</para>
<title>
<note>
<referenceID ref="001-2"/>
</note>
</title>
</group>
<group id = "2">
<para>
<note>
<referenceID ref="222-1"/>
</note>
</para>
</group>
</file>
我的转换基于this post中的解决方案,该解决方案基于绝对位置对我的参考进行编号,但现在我被卡住了。有关如何让它重新启动每组中的计数的任何指示?
<xsl:template match="referenceID">
<xsl:variable name="refNum" select="@ref"/>
<xsl:variable name="refAdd">
<xsl:value-of select="count(preceding::referenceID) + 1"/>
</xsl:variable>
<xsl:copy>
<xsl:attribute name="ref">
<xsl:value-of select="concat($refNum,'-',$refAdd)"/>
</xsl:attribute>
<xsl:apply-templates/>
</xsl:copy>
</xsl:template>
答案 0 :(得分:4)
请尝试使用xsl:number。
示例...
XML输入
<file>
<group id = "1">
<title/>
<para>
<referenceID ref="123"/>
</para>
<title>
<note>
<referenceID ref="001"/>
</note>
</title>
</group>
<group id = "2">
<para>
<note>
<referenceID ref="222"/>
</note>
</para>
</group>
</file>
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="referenceID">
<xsl:variable name="nbr">
<xsl:number level="any" from="group"/>
</xsl:variable>
<referenceId ref="{concat(@ref,'-',$nbr)}">
<xsl:apply-templates select="@*[not(name()='ref')]|node()"/>
</referenceId>
</xsl:template>
</xsl:stylesheet>
<强>输出强>
<file>
<group id="1">
<title/>
<para>
<referenceID ref="123-1"/>
</para>
<title>
<note>
<referenceID ref="001-2"/>
</note>
</title>
</group>
<group id="2">
<para>
<note>
<referenceID ref="222-1"/>
</note>
</para>
</group>
</file>