Creating for Expressions
XPath provides the for expression so that you can iterate over data. Here's how the for expression works in general:
for variable in sequence return expression
Here, the variable is called the range variable , the value of the expression that follows the in keyword is called the input sequence , and the expression that follows the return keyword is called the return expression .
The result of the for expression is obtained by evaluating the return expression once for each item in the input sequence. The resulting sequence is returned (if multiple sequences are generated, they are concatenated ).
You can see an example in ch08_02.xsl , where we're using a for expression to create a sequence of all the planet names in our planetary data XML document:
for $variable in //planet return $variable/name
To display our results using an XPath 2.0 style sheet, we'll use the <xsl:value-of> element to insert the result sequence of names into the output. That means we have to use this element's separator attribute to indicate what text we want inserted between items in the sequenceif you don't use this attribute, you'll only get the first item in the sequence. You can see what the XSLT 2.0 style sheet looks like in ch08_02.xsl (Listing 8.2).
Listing 8.2 An XSLT Example Using the for Expression ( ch08_02.xsl )
<xsl:stylesheet version="2.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns:xs="http://www.w3.org/2001/XMLSchema"> <xsl:template match="/"> <xsl:value-of select="for $variable in //planet return $variable/name" separator=", "/> </xsl:template> </xsl:stylesheet>
And here's the result when we use Saxon to apply the ch08_02.xsl style sheet to our planetary data document:
C:\Saxon>java net.sf.saxon.Transform ch02_01.xml ch08_02.xsl <?xml version="1.0" encoding="UTF-8"?> Mercury, Venus, Earth
As you can see, we do indeed get all three planetary names this way. A for expression can also use multiple variables. For example, this expression uses two variables at once:
for $x in (1, 2) $y in (3, 4) return ($x * $y)
The result of this for expression is the sequence (3, 4, 6, 8).