# xsl:for-each

The `xsl:for-each` element causes iteration over the nodes selected by a node-set expression. It can be used as an alternative to `xsl:apply-templates` where the child nodes of the current node are known in advance. There is a mandatory attribute, `select`, which defines the nodes over which the statement will iterate. The XSLT statements subordinate to the `xsl:for-each` element are applied to each source node selected by the node-set expression in turn.

The full syntax of expressions is outlined in XPath Expression Syntax.

The `xsl:for-each` element may have one or more `xsl:sort` child elements to define the order of sorting. The sort keys are specified in major-to-minor order.

The expression used for sorting can be any string expressions. The following are particularly useful:

- element-name, e.g. TITLE: sorts on the value of a child element

- attribute-name, e.g. @CODE: sorts on the value of an attribute

- ".": sorts on the character content of the element

- "qname(.)": sorts on the name of the element

Example 1:

    <xsl:template match="BOOKLIST">
        <TABLE>
        <xsl:for-each select="BOOK">
            <TR>
            <TD><xsl:value-of select="TITLE"/></TD>
            <TD><xsl:value-of select="AUTHOR"/></TD>
            <TD><xsl:value-of select="ISBN"/></TD>
            </TR>
        </xsl:for-each>
        </TABLE>
    </xsl:template>

Example 2: sorting with xsl:for-each. This example also shows a template for a BOOKLIST element which processes all the child BOOK elements in order of their child AUTHOR elements.

    <xsl:template match="BOOKLIST">
        <h2>
            <xsl:for-each select="BOOK">
                <xsl:sort select="AUTHOR"/>
                <p>AUTHOR: <xsl:value-of select="AUTHOR"/></p>
                <p>TITLE: <xsl:value-of select="TITLE"/></p>
                <hr/>
            </xsl:for-each>
        </h2>
    </xsl:template>

Next