Saxonica.com

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.

Next