的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。 我怎么能得到它?
答案 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>