xsl:for-each
Syntax:
<xsl:for-each select="pattern" order-by="sorteringskriteria">
...
</xsl:for-each>
Sorteringen är inte obligatorisk, men select måste anges.
För select gäller de normala reglerna för patterns, se
kapitlet om detta.
För order-by används ett eller flera nodnamn. Använder man flera
så skall de separeras med semikolon (;) mellan. Normalt sorteras datat
i stigande ordning. Vill man sortera i fallande ordning så sätter
man ett - före nodens namn. Man kan äen sätta ett plus (+), men
det är inte nödvändigt. Nedan några exempel på detta:
<xsl:for-each select="persons/person" order-by="lastname;
firstname">
<xsl:for-each select="persons/person" order-by="lastname;
-firstname">
Nedan sorteras förare efter namn
xml23_1.xsl
<?xml version='1.0' encoding="iso-8859-1" ?>
<xsl:stylesheet xmlns:xsl="http://www.w3.org/TR/WD-xsl">
<xsl:template match="/">
<html>
<head><title>Racing</title></head>
<body bgcolor="#FFFFFF" text="#000000">
<table>
<xsl:for-each select="racers/driver" order-by="-name">
<tr>
<td><xsl:value-of select="name"/></td>
<td><xsl:value-of select="nationality"/></td>
<td><xsl:value-of select="@type"/></td>
</tr>
</xsl:for-each>
</table>
</body>
</html>
</xsl:template>
</xsl:stylesheet>
Om du har IE 5.0 eller nyare kan du klicka här för att se filen i praktiken
xml23_1.xml
<?xml version="1.0" encoding="iso-8859-1"?>
<?xml-stylesheet type="text/xsl" href="xml23_1.xsl"?>
<racers>
<driver type="F1">
<name>Mika Häkkinen</name>
<nationality>Finn</nationality>
<rating>1</rating>
</driver>
<driver type="F1">
<name>David Coulthard</name>
<nationality>Scottish</nationality>
<rating>11</rating>
</driver>
<driver type="rally">
<name>Colin McRae</name>
<rating>3</rating>
</driver>
<driver type="rally">
<name>Marcus Grönholm</name>
<nationality>Finn</nationality>
<rating>2</rating>
</driver>
</racers>
Öppna XML filen Öppna XML konverterad till HTML (Även NS)
I exemplet nedan så försöker vi sortera förarna efter
rating (betyg) men det lyckas inte riktigt bra:
xml23_2.xsl
<?xml version='1.0' encoding="iso-8859-1" ?>
<xsl:stylesheet xmlns:xsl="http://www.w3.org/TR/WD-xsl">
<xsl:template match="/">
<html>
<head><title>Racing</title></head>
<body bgcolor="#FFFFFF" text="#000000">
<table>
<xsl:for-each select="racers/driver" order-by="rating">
<tr>
<td><xsl:value-of select="name"/></td>
<td><xsl:value-of select="nationality"/></td>
<td><xsl:value-of select="@type"/></td>
<td><xsl:value-of select="rating"/></td>
</tr>
</xsl:for-each>
</table>
</body>
</html>
</xsl:template>
</xsl:stylesheet>
Om du har IE 5.0 eller nyare kan du klicka här för att se filen i praktiken
Öppna XML filen Öppna XML konverterad till HTML (Även NS)
Vi har samma problem som när vi t.ex. görsöker sortera filer
vilkas filnamn innehåller siffror. Vi tror att vi sorterar numeriskt,
men vi gör en ASCII sortering. Vi måste säga åt XSL tolken
att sorteringens skall ske numeriskt. Nedanstående exempel gör detta.
Den sorterar även efter namn i fallande ordning (även om det inte
har så stor betydelse med vårt testdata):
xml23_3.xsl
<?xml version='1.0' encoding="iso-8859-1" ?>
<xsl:stylesheet xmlns:xsl="http://www.w3.org/TR/WD-xsl">
<xsl:template match="/">
<html>
<head><title>Racing</title></head>
<body bgcolor="#FFFFFF" text="#000000">
<table>
<xsl:for-each select="racers/driver" order-by="number(rating); -name">
<tr>
<td><xsl:value-of select="name"/></td>
<td><xsl:value-of select="nationality"/></td>
<td><xsl:value-of select="@type"/></td>
<td><xsl:value-of select="rating"/></td>
</tr>
</xsl:for-each>
</table>
</body>
</html>
</xsl:template>
</xsl:stylesheet>
Om du har IE 5.0 eller nyare kan du klicka här för att se filen i praktiken
Öppna XML filen Öppna XML konverterad till HTML (Även NS)