Получить общее количество элементов (итераций) в цикле XSLT for-each - PullRequest
4 голосов
/ 28 декабря 2011

Я обычно использую шаблоны 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 ]

9 голосов
/ 28 декабря 2011

Если вы зациклились на некотором $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), чтобы получить количество итераций.

2 голосов
/ 13 июля 2017

Ответ Уэйна работает и может быть необходим в определенных обстоятельствах, когда существуют другие требования, которые должны быть выполнены.Но, если у вас простая ситуация, вы можете сделать это более эффективно с помощью функции 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, выходные данные идентичнык результату Уэйна.

1 of 6
2 of 6
3 of 6
4 of 6
5 of 6
6 of 6
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...