<xsl:sequence> XSLT

Become a Patron!

Элемент xsl:sequence создает последовательность узлов и/или атомарных значений.

Элементы-потомки:

Синтаксис

XSLT 2.0 и XSLT 3.0

<xsl:sequence
    select = expression>
    <!-- Content: xsl:fallback* -->
</xsl:sequence>
  • selectобязательный атрибут, выражение XPath, определяющее содержимое последовательности.

Описание и примеры

Содержимое

Нуль или более элементов <xsl:fallback>. Элемент <xsl:fallback> определяет действия, которые должны быть выполнены при обнаружении элемента, не поддерживаемого процессором XSLT. Элементы <xsl:fallback> чаще всего задаются для процессоров XSLT, работающих в режиме прямой совместимости.

Пример

Далее приводится простой пример с созданием последовательности в элементе <xsl:variable>. Таблица стилей выглядит так:

<?xml version="1.0" encoding="utf-8"?>
<!-- sequence.xsl -->
<xsl:stylesheet version="2.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns:xs="http://www.w3.org/2001/XMLSchema">
    <xsl:output method="text"/>
    <xsl:template match="/">
        <xsl:variable name="sales" as="xs:integer*">
            <xsl:for-each select="/report/brand/units">
                <xsl:if test=". > 10000">
                    <xsl:sequence select="."/>
                </xsl:if>
            </xsl:for-each>
        </xsl:variable>
        <xsl:value-of select="/report/title"/>
        <xsl:text>&#xA;&#xA;Sales figures: </xsl:text>
        <xsl:value-of select="$sales" separator=", "/>
        <xsl:text>&#xA;&#xA;Sequence total: &#x9;</xsl:text>
        <xsl:value-of select="format-number(sum($sales), '$#,###.00')"/>
        <xsl:text>&#xA;Sequence average:&#x9;</xsl:text>
        <xsl:value-of select="format-number(avg($sales), '$#,###.00')"/>
    </xsl:template>
</xsl:stylesheet>

В цикле <xsl:for-each> каждый элемент <xsl:sequence> создает последовательность из одного узла. Значение переменной представляет собой последовательность значений xs:integer, созданных на базе всех объектов (узлов и атомов), сгенерированных элементами <xsl:sequence>. (Иначе говоря, все, что выбирается элементом <xsl:sequence>, преобразуется в xs:integer, а затем становится частью переменной.) Применим таблицу стилей к отчету с данными о продажах шоколада:

<?xml version="1.0" encoding="utf-8"?>
<!-- chocolate.xml -->
<report month="8" year="2006">
    <title>Chocolate bar sales</title>
    <brand>
        <name>Lindt</name>
        <units>27408</units>
    </brand>
    <brand>
        <name>Callebaut</name>
        <units>8203</units>
    </brand>
    <brand>
        <name>Valrhona</name>
        <units>22101</units>
    </brand>
    <brand>
        <name>Perugina</name>
        <units>14336</units>
    </brand>
    <brand>
        <name>Ghirardelli</name>
        <units>19268</units>
    </brand>
</report>

Наша таблица стилей создает последовательность из всех элементов <units>, превышающих 10000. Результат выглядит так:

Chocolate bar sales
Sales figures: 27408, 22101, 14336, 19268
Sequence total: $83,113.00
Sequence average: $20,778.25

Помните, что последовательность может содержать произвольную комбинацию узлов и атомарных значений. Если нам вдруг захочется повысить объемы продаж, в последовательность можно включить дополнительные значения:

<!-- sequence2.xsl -->
...
<xsl:variable name="sales" as="xs:integer*">
    <xsl:for-each select="/report/brand/units">
        <xsl:if test=". > 10000">
            <xsl:sequence select="."/>
        </xsl:if>
    </xsl:for-each>
    <xsl:sequence select="(80000, 75000, 65000)"/>
</xsl:variable>
...

С новыми данными отчет о продажах выглядит намного внушительнее:

Chocolate bar sales
Sales figures: 27408, 22101, 14336, 19268, 80000, 75000, 65000
Sequence total: $303,113.00
Sequence average: $43,301.86

Напомню, что переменная содержит последовательность типа xs:integer*, поэтому все выбранные узлы и атомарные значения преобразуются в xs:integer, прежде чем стать частью переменной.