# 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.

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.

Next