# xsl:sequence

The `xsl:sequence` element is used to construct arbitrary sequences. It may select any sequence of nodes and/or atomic values, and essentially adds these to the result sequence. The input may be specified either by a `select` attribute, or by the instructions contained in the `xsl:sequence` instruction, or both (the `select` attribute is processed first). Nodes and atomic values are included in the result sequence directly. Unlike `xsl:copy-of`, no copy is made.

The `as` attribute may be used to define the required type of the sequence. The actual value is converted to the required type if necessary, using the conversions that are permitted on function calls. (Specifically, atomization of nodes, casting of untyped atomic values, and numeric promotion.) If the type cannot be converted, a run-time error occurs.

There are two main usage scenarios. The first is copying atomic values into a tree. For example:

    <e>
        <xsl:sequence select="1 to 5"/>
        <br/>
        <xsl:sequence select="6 to 10"/>
    </e>

which produces the output `<e>1 2 3 4 5<br/>6 7 8 9 10</e>`.

The second, more important, is constructing a sequence-valued variable. A variable is sequence-valued if the variable binding element (e.g. `xsl:variable` has non-empty content, an `as` attribute, and no `select` attribute. For example:

    <xsl:variable name="seq" as="xs:integer *">
        <xsl:for-each select="1 to 5">>
           <xsl:sequence select=". * ."/>
        </xsl:for-each/>
    </xsl:variable>

This produces the sequence (1, 4, 9, 16, 25) as the value of the variable.

The `xsl:sequence` instruction may be used to produce any sequence of nodes and/or atomic values.

If nodes are constructed within a sequence-valued variable, they will be parentless. For example, the following code creates a variable whose value is a sequence of three parentless attributes:

    <xsl:variable name="seq" as="attribute() *">
        <xsl:attribute name="a">10</xsl:attribute>
        <xsl:attribute name="b">20</xsl:attribute>
        <xsl:attribute name="a">30</xsl:attribute>
    </xsl:variable>

It is quite legitimate to have two attributes in the sequence with the same name; there is no conflict until an attempt is made to add them both to the same element. The attributes can be added to an element by using `<xsl:copy-of select="$seq"/>` within an `xsl:element` instruction or within a literal result element. At this stage the usual rule applies: if there are duplicate attributes, the last one wins.

From release 8.1 Saxon no longer allows an `xsl:sequence` element to have any child instructions, other than optional `xsl:fallback` instructions. This is a change to the specification made after the November 2003 draft was published, in response to last-call comments.

At present it is probably more efficient in Saxon to use XPath facilities (`for` expressions, etc) to construct sequences, rather than doing it at the XSLT level.

Expand | Next