Перейти к содержанию

xsl:iterate

Используется для итерации последовательности с возможностью задания параметров для использования в следующей итерации.

Доступен в XSLT 3.0. Начиная с Saxon 9.8, доступен во всех редакциях. Реализован в Saxon-PE и Saxon-EE начиная с Saxon 9.6.

  • Категория: инструкция
  • Содержимое: ( xsl:param* , xsl:on-completion? , sequence-constructor )
  • Допустимые родительские элементы: любой элемент XSLT, модель содержимого которого - sequence-constructor; любой литеральный элемент результата

Атрибуты

select
expression
Входная последовательность, над которой обрабатывается итерация.

Заметки по реализации Saxon

Порядок элементов в xsl:iterate изменился со времен первоначального рабочего проекта W3C (xsl:on-completion теперь идет сразу после xsl:param). Начиная с версии Saxon 9.7, разрешено только новое упорядочивание. В Saxon 9.6 допускается как новое, так и старое упорядочивание, но при использовании старого упорядочивания выдается предупреждение.

В более ранних версиях Saxon прототип xsl:iterate был реализован как расширение в пространстве имен Saxon (saxon:iterate). В Saxon 9.5 это расширение было упразднено.

Чтобы xsl:iterate был потоковым, правила W3C требуют, чтобы выражение select было "striding", что означает, что оно может использовать дочернюю ось, но не ось потомков (чтобы выбранные узлы не перекрывали друг друга). До версии Saxon 9.5 Saxon пытался быть более либеральным и разрешить ограниченный поток также при использовании оси потомка. Начиная с версии Saxon 9.6, Saxon был приведен в соответствие со спецификацией W3C. Во многих случаях ограничение можно обойти, используя функцию outermost, например, выражение outermost(//title) является striding, несмотря на то, что в нем используется ось descendant.

Подробности

Инструкция xsl:iterate является новой в XSLT 3.0. Она похожа на xsl:for-each, за исключением того, что элементы входной последовательности обрабатываются последовательно, и после обработки каждого элемента входной последовательности можно задать параметры для использования в следующей итерации. Поэтому его можно использовать для решения проблем, для которых в XSLT 2.0 требовались рекурсивные функции или шаблоны.

Инструкция xsl:iterate мотивирована случаями использования для потоковой обработки, но она также может быть выгодно использована в ситуациях, не связанных с потоковой обработкой. Для получения дополнительной информации смотрите Потоковая передача с xsl:iterate.

Инструкция допускает дочерний элемент xsl:on-completion, который определяет обработку, выполняемую при исчерпании входной последовательности. Инструкции внутри xsl:on-completion имеют доступ к конечным значениям параметров, объявленных в наборе инструкций xsl:next-iteration при обработке последнего элемента в последовательности. Элемент xsl:break может быть использован внутри вложенного конструктора последовательности инструкции xsl:iterate, что вызывает преждевременное завершение до обработки всей входной последовательности.

Примеры

Пример 1

Вычисляет текущий баланс последовательности финансовых операций:

1
2
3
4
5
6
7
8
9
<xsl:iterate select="transactions/transaction">
    <xsl:param name="balance" select="0.00" as="xs:decimal"/>
    <xsl:variable name="newBalance"
        select="$balance + xs:decimal(@value)"/>
    <balance date="{@date}" value="{$newBalance}"/>
    <xsl:next-iteration>
        <xsl:with-param name="balance" select="$newBalance"/>
    </xsl:next-iteration>
</xsl:iterate>

Пример 2

Копирует входную последовательность до первого элемента <br>:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
<xsl:iterate select="*">
    <xsl:choose>
        <xsl:when test="self::br">
            <xsl:break/>
        </xsl:when>
        <xsl:otherwise>
            <xsl:copy-of select="."/>
        </xsl:otherwise>
    </xsl:choose>
</xsl:iterate>

Ссылки

См. также

Комментарии