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ů:
select
Výraz, který vybere hodnoty, podle kterých se provede řazení.
data-type
Standardně 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
).
order
Výběr vzestupného (ascending
)
nebo sestupného (descending
)
uspořádání.
lang
Kód jazyka, jehož pravidla se mají použít pro porovnávání. Ne všechny procesory tuto vlastnost podporují.
case-order
Mají 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>