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>