xslt确定元素的数量和位置

时间:2014-06-04 19:39:31

标签: xml xslt xpath

我一直在寻找解决方案,我只是找不到答案。我希望有人可以提供帮助。这是我的问题:

我正在尝试计算名为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>

1 个答案:

答案 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>