http://exslt.org/sets
set
Rozdíl mezi dvěma množinami uzlů.
seznam uzlů set:difference(
seznam uzlů, seznam uzlů)
Vrátí seznam uzlů, kde jsou z původního seznamu odstraněny uzly, jejichž textová podoba by se opakovala.
seznam uzlů set:distinct(
seznam uzlů)
Tato funkce nám umožní výrazným způsobem zjednodušit operace jako je seskupování uzlů. Vrátíme se k našemu příkladu se seřazením a seskupením citátů podle jména jejich autora.
Příklad 13.5. Seskupování pomocí set:distinct – citaty-podle-autoru4.xsl
<?xml version="1.0" encoding="utf-8"?> <xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns:set="http://exslt.org/sets" extension-element-prefixes="set" exclude-result-prefixes="set"> <xsl:output indent="yes" method="html" encoding="utf-8"/> <xsl:template match="citaty"> <html> <head> <title>Citáty podle autorů</title> </head> <body> <xsl:for-each select="set:distinct(citat/autor)"> <xsl:sort select="."/> <xsl:variable name="autor" select="."/> <h1><xsl:value-of select="$autor"/></h1> <xsl:for-each select="//citat[autor=$autor]"> <xsl:sort select="text"/> <p> <xsl:value-of select="text"/> </p> </xsl:for-each> </xsl:for-each> </body> </html> </xsl:template> </xsl:stylesheet>
Výsledný kód je jednodušší a navíc asi o 20 %
rychlejší. Velkým zdržením je totiž stále výběr citátů podle jména
autora. To je však typický případ, kdy nám pomůže funkce
key()
.
Příklad 13.6. Rychlé seskupování pomocí set:distinct a xsl:key –
citaty-podle-autoru5.xsl
<?xml version="1.0" encoding="utf-8"?> <xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns:set="http://exslt.org/sets" extension-element-prefixes="set" exclude-result-prefixes="set"> <xsl:output indent="yes" method="html" encoding="utf-8"/> <xsl:key name="citaty" match="//citat" use="autor"/> <xsl:template match="citaty"> <html> <head> <title>Citáty podle autorů</title> </head> <body> <xsl:for-each select="set:distinct(citat/autor)"> <xsl:sort select="."/> <xsl:variable name="autor" select="."/> <h1><xsl:value-of select="$autor"/></h1> <xsl:for-each select="key('citaty',$autor)"> <xsl:sort select="text"/> <p> <xsl:value-of select="text"/> </p> </xsl:for-each> </xsl:for-each> </body> </html> </xsl:template> </xsl:stylesheet>
Test, zda dva seznamy uzlů obsahují alespoň jeden stejný uzel.
boolean set:has-same-node(
seznam uzlů, seznam uzlů)
Vrací průnik dvou množin uzlů.
seznam uzlů set:intersection(
seznam uzlů, seznam uzlů)
Vrací uzly, které v dokumentu předchází prvnímu uzlu z druhého seznamu.
seznam uzlů set:leading(
seznam uzlů, seznam uzlů)
Z prvního seznamu uzlů vrátí ty uzly, které jsou v dokumentu před prvním uzlem z druhého seznamu. Pokud první uzel druhého seznamu není v prvním seznamu, nevrátí funkce žádný uzel. Pokud je druhý parametr prázdný seznam, vrací funkce všechny uzly z prvního seznamu.
Vrací uzly, které v dokumentu následují za prvním uzlem z druhého seznamu.
seznam uzlů set:trailing(
seznam uzlů, seznam uzlů)
Z prvního seznamu uzlů vrátí ty uzly, které jsou v dokumentu za prvním uzlem z druhého seznamu. Pokud první uzel druhého seznamu není v prvním seznamu, nevrátí funkce žádný uzel. Pokud je druhý parametr prázdný seznam, vrací funkce všechny uzly z prvního seznamu.