如何获取具有特殊属性值的节点数的节点索引

时间:2014-10-30 09:27:01

标签: xml xslt

的xml:

<fields>
  <field name="name1" />
  <field name="special" />
  <field name="name1" />
  <field name="special" />
  <field name="name1" />
</fields>

XSLT:

<xsl:apply-temlates select="//field" />

...

<xsl:template match="field[@name='special']">
  <xsl:value-of select="_what_here?_" />
</xsl:template>

我的模板必须返回1和2,而不是像position()那样返回2和4。 我怎么能得到它?

1 个答案:

答案 0 :(得分:2)

使用preceding-sibling::轴来计算所有相关的field元素。

<强>样式表

<?xml version="1.0" encoding="UTF-8" ?>
<xsl:transform xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="2.0">
    <xsl:output method="text"  encoding="UTF-8"/>

    <xsl:strip-space elements="*"/>

    <xsl:template match="/fields">
      <xsl:apply-templates select="field"/>
    </xsl:template>

    <xsl:template match="field[@name='special']">
        <xsl:value-of select="count(preceding-sibling::field[@name='special']) + 1" />
    </xsl:template>

</xsl:transform>

文字输出

12

另一个解决方案是根本不使用单独的模板,而是使用for-each。在for-each内,position()函数的行为完全符合您的要求 - 它检索for-each中元素序列中的位置。

<?xml version="1.0" encoding="UTF-8" ?>
<xsl:transform xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="2.0">
    <xsl:output method="text"  encoding="UTF-8"/>

    <xsl:strip-space elements="*"/>

    <xsl:template match="/fields">
      <xsl:for-each select="field[@name='special']">
          <xsl:value-of select="position()"/>
      </xsl:for-each>
    </xsl:template>

</xsl:transform>