Uzly, které chceme zpracovat pomocí <xsl:for-each> a <xsl:apply-templates>, můžeme před
zpracováním seřadit podle různých kritérií. Uzly se pak nezpracovávají
v pořadí daném dokumentem, ale v pořadí definovaném
tříděním.
Kritéria třídění se určují pomocí instrukce <xsl:sort>, která se jako první uvádí
uvnitř <xsl:for-each> nebo
<xsl:apply-templates>.
Třídění se ovládá pomocí následujících atributů:
selectVýraz, který vybere hodnoty, podle kterých se provede řazení.
data-typeStandardně se provádí lexikografické porovnávání, pokud chceme
hodnoty vybrané pomocí select
porovnávat jako čísla, musíme změnit datový typ na number (implicitní je text).
orderVýběr vzestupného (ascending)
nebo sestupného (descending)
uspořádání.
langKód jazyka, jehož pravidla se mají použít pro porovnávání. Ne všechny procesory tuto vlastnost podporují.
case-orderMají se velká písmena řadit před malá (upper-first nebo lower-first).
Příklad 6.1. Seřazení citátů podle abecedy – citaty-podle-abecedy.xsl
<?xml version="1.0" encoding="utf-8"?> <xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"> <xsl:output indent="yes" method="html" encoding="utf-8"/> <xsl:template match="citaty"> <html> <head> <title>Citáty podle abecedy</title> </head> <body> <xsl:for-each select="citat"> <xsl:sort select="text"/> <p> <xsl:value-of select="text"/> <xsl:text> - </xsl:text> <xsl:value-of select="autor"/> </p> </xsl:for-each> </body> </html> </xsl:template> </xsl:stylesheet>
Pokud chceme řadit podle několika kritérií najednou, stačí uvést
několik instrukcí <xsl:sort>
za sebou. Pokud se kritérium z prvního řazení pro některé uzly
shoduje, rozhodnou o výsledném pořadí následující specifikace
řazení.
Následující ukázka seřadí citáty primárně podle jména autora a sekundárně podle textu citátu.
Příklad 6.2. Víceúrovňové řazení – citaty-podle-autoru3.xsl
<?xml version="1.0" encoding="utf-8"?> <xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"> <xsl:output indent="yes" method="html" encoding="utf-8"/> <xsl:template match="citaty"> <html> <head> <title>Citáty podle abecedy</title> </head> <body> <xsl:for-each select="citat"> <xsl:sort select="autor"/> <xsl:sort select="text"/> <p> <xsl:value-of select="autor"/> <xsl:text> - </xsl:text> <xsl:value-of select="text"/> </p> </xsl:for-each> </body> </html> </xsl:template> </xsl:stylesheet>