获取XSLT for-each循环中的元素总数(迭代)

时间:2011-12-28 18:04:43

标签: xml xslt

我通常使用jquery模板来处理这类事情,但是我继承了一个我需要更新的XSLT文件,但我找不到一种方法来获取特定模板调用的元素总数(迭代次数)。

使用jquery模板我会做这样的事情,它会给我我正在循环的资产总数。

<span id="${spnID}">
    ${GroupName} (${Assets.length})
</span>

如果循环中有五个元素,这将返回“Product x(5)”。

看起来很简单但我似乎找不到用XSLT做同样事情的方法。我想是这样的事情:

<span id="{$SpnId}">
    <xsl:value-of select="$GroupName"/> (<xsl:value-of select="$total-number-of-elements"/>)
</span>

2 个答案:

答案 0 :(得分:9)

如果您循环某些$set,则输出count($set)以获取要迭代的项目总数。例如,试试这个样式表:

<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
    <xsl:output method="text" />
    <xsl:template match="/">
        <xsl:variable name="set" select="/table/row" />
        <xsl:variable name="count" select="count($set)" />
        <xsl:for-each select="$set">
            <xsl:value-of select="concat(position(), ' of ', $count, '&#xa;')" />
        </xsl:for-each>
    </xsl:template>
</xsl:stylesheet>

反对这一输入:

<table>
    <row id="1" />
    <row id="2" />
    <row id="3" />
    <row id="4" />
    <row id="5" />
    <row id="6" />
</table>

输出:

1 of 6
2 of 6
3 of 6
4 of 6
5 of 6
6 of 6

请注意,我们循环遍历/table/row选择的节点并输出count(/table/row)以获取迭代次数。

答案 1 :(得分:2)

Wayne的回答是有效的,在某些情况下,当必须满足其他要求时,可能是必要的。但是,如果您遇到一个简单的情况,可以使用Last()函数更有效地完成。只要处理for-each,Last()就会包含集合的上限或计数。

<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
    <xsl:output method="text" />
    <xsl:template match="/">
    <xsl:for-each select="/table/row">
        <xsl:value-of select="concat(position(), ' of ', last(), '&#xa;')" />
    </xsl:for-each>
</xsl:template>

针对相同的XML运行,输出与Wayne的结果相同。

1 of 6
2 of 6
3 of 6
4 of 6
5 of 6
6 of 6