K dispozici máme novou instrukci
<xsl:for-each-group>
, která na základě
několika parametrů rozdělí vybrané uzly do skupin a pro každou skupinu
pak provádí své tělo. Uvnitř těla jsou všechny uzly jedné skupiny
dostupné pomocí funkce current-group()
.
Seskupování je opravdu velmi flexibilní a pro pochopení všech možností
doporučuji nahlédnout přímo do návrhu XSLT 2.0.
Příklad 14.4. Seskupování je v XSLT 2.0 hračka – citaty-podle-autoru6.xsl
<?xml version="1.0" encoding="utf-8"?> <xsl:stylesheet version="2.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"> <xsl:output indent="yes" method="xhtml" encoding="utf-8"/> <xsl:template match="citaty"> <html> <head> <title>Citáty podle autorů</title> </head> <body> <xsl:for-each-group select="citat" group-by="autor"> <xsl:sort select="current-grouping-key()" lang="cs"/> <h1><xsl:value-of select="current-grouping-key()"/></h1> <xsl:for-each select="current-group()"> <xsl:sort select="text" lang="cs"/> <p> <xsl:value-of select="text"/> </p> </xsl:for-each> </xsl:for-each-group> </body> </html> </xsl:template> </xsl:stylesheet>
Příklad 14.5. Seskupováním lze vyřešit i na první pohled nesouvisející
úlohy – katalog-odrazky2.xsl
<?xml version="1.0" encoding="utf-8"?> <xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="2.0"> <xsl:output method="html" encoding="utf-8"/> <xsl:template match="/"> <HTML> <HEAD> <TITLE>Katalog <xsl:value-of select="katalog/info/firma"/></TITLE> </HEAD> <BODY> <H1>Katalog <xsl:value-of select="katalog/info/firma"/></H1> <xsl:apply-templates select="//polozka"/> </BODY> </HTML> </xsl:template> <xsl:template match="polozka"> <xsl:apply-templates/> <HR/> </xsl:template> <xsl:template match="nazev"> <H2><xsl:apply-templates/></H2> <xsl:if test="../foto/@href"> <IMG src="{../foto/@href}" alt="{.}" align="right"/> </xsl:if> </xsl:template> <xsl:template match="kategorie"> <EM><xsl:apply-templates/></EM> </xsl:template> <xsl:template match="cena"> <STRONG> - <xsl:apply-templates/> Kč</STRONG> </xsl:template> <xsl:template match="popis"> <UL> <xsl:for-each-group select="node()" group-starting-with="br"> <LI> <xsl:apply-templates select="current-group()"/> </LI> </xsl:for-each-group> </UL> </xsl:template> <xsl:template match="b"> <FONT COLOR="RED"><xsl:apply-templates/></FONT> </xsl:template> </xsl:stylesheet>