<xsl:for-each> |
Acts as XSLT's iteration operator. This element has a select attribute that selects some nodes from the current context.
Category
Instruction
Required Attributes
select Contains an XPath expression that selects nodes from the current context.
Optional Attributes
None.
Content
<xsl:for-each> contains a template that is evaluated against each of the selected nodes. The <xsl:for-each> element can contain one or more <xsl:sort> elements to order the selected nodes before they are processed. All <xsl:sort> elements must appear first, before the template begins.
Appears in
<xsl:for-each> appears inside a template.
Defined in
XSLT section 8, Repetition.
Example
We'll demonstrate the <xsl:for-each> element with the following stylesheet:
    <?xml version="1.0"?>
    <xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">

      <xsl:output method="text"/>

      <xsl:variable name="newline">
    <xsl:text>
    </xsl:text>
      </xsl:variable>

      <xsl:variable name="complicatedVariable">
        <xsl:choose>
          <xsl:when test="count(//listitem) > 10">
            <xsl:text>really long list</xsl:text>
          </xsl:when>
          <xsl:when test="count(//listitem) > 5">
            <xsl:text>moderately long list</xsl:text>
          </xsl:when>
          <xsl:otherwise>
            <xsl:text>fairly short list</xsl:text>
          </xsl:otherwise>
        </xsl:choose>
      </xsl:variable>

      <xsl:template match="/">
        <xsl:value-of select="$newline"/>
        <xsl:text>Here is a </xsl:text>
        <xsl:value-of select="$complicatedVariable"/>
        <xsl:text>:</xsl:text>
        <xsl:value-of select="$newline"/>
        <xsl:variable name="listitems" select="list/listitem"/>
        <xsl:call-template name="processListitems">
          <xsl:with-param name="items" select="$listitems"/>
        </xsl:call-template>
      </xsl:template>

      <xsl:template name="processListitems">
        <xsl:param name="items"/>
        <xsl:for-each select="$items">
          <xsl:value-of select="position()"/>
          <xsl:text>.  </xsl:text>
          <xsl:value-of select="."/>
          <xsl:value-of select="$newline"/>
        </xsl:for-each>
      </xsl:template>

    </xsl:stylesheet>
In this stylesheet, we use an <xsl:param> named items to illustrate the <xsl:for-each> element. The items parameter contains some number of <listitem> elements from the XML source document; the <xsl:for-each> element iterates through all those elements and processes each one. We'll use our stylesheet with the following XML document:
    <?xml version="1.0"?>
    <list>
      <title>A few of my favorite albums</title>
      <listitem>A Love Supreme</listitem>
      <listitem>Beat Crazy</listitem>
      <listitem>Here Come the Warm Jets</listitem>
      <listitem>Kind of Blue</listitem>
      <listitem>London Calling</listitem>
      <listitem>Remain in Light</listitem>
      <listitem>The Joshua Tree</listitem>
      <listitem>The Indestructible Beat of Soweto</listitem>
    </list>
When we run the transformation, here are the results:
    Here is a moderately long list:
    1.  A Love Supreme
    2.  Beat Crazy
    3.  Here Come the Warm Jets
    4.  Kind of Blue
    5.  London Calling
    6.  Remain in Light
    7.  The Joshua Tree
    8.  The Indestructible Beat of Soweto
The <xsl:for-each> element has iterated through all the <listitem> elements from the XML source document and has processed each one.