Pomocí klíčů můžeme dosáhnout podobný efekt, jako pomocí
ID
, IDREF
a pomocí funkce id()
. Mechanismus klíčů je však
v mnohém lepší.
Každý klíč, který v dokumentu definujeme má tři vlastnosti:
jméno – pomocí jména je každý klíč jednoznačně identifikován; díky tomu můžeme mít ve stylu více různých klíčů;
seznam uzlů, pro které je klíč vytvořen;
výraz pro získání klíče – výraz, který pro každý uzel v seznamu zjistí hodnotu klíče.
Oproti ID/IDREF
mechanismu tu
máme hned několik výhod:
hodnoty klíče nemusí být unikátní;
počet klíčů není omezen;
hodnota klíče může být libovolný řetězec;
pro dokument nemusí existovat DTD.
Klíč se definuje pro celý styl pomocí instrukce:
<xsl:key name="jméno klíče
" match="seznam uzlů v klíči
" use="výpočet klíče
"/>
Pomocí funkce key()
pak
můžeme rychle vybírat jednotlivé uzly definované v klíči. Vše
ilustruje následující jednoduchý příklad.
Příklad 8.1. Databáze zaměstnanců – zamestnanci.xml
<?xml version="1.0" encoding="utf-8"?> <zamestnanci> <zamestnanec oc="1164"> <jmeno>Procházka Karel</jmeno> <sef>2021</sef> </zamestnanec> <zamestnanec oc="1168"> <jmeno>Novotná Alena</jmeno> <sef>2021</sef> </zamestnanec> <zamestnanec oc="1230"> <jmeno>Klíma Josef</jmeno> <sef>1168</sef> </zamestnanec> <zamestnanec oc="1564"> <jmeno>Pinkas Josef</jmeno> <sef>2021</sef> </zamestnanec> <zamestnanec oc="2021"> <jmeno>Kládová Adéla</jmeno> </zamestnanec> </zamestnanci>
Příklad 8.2. Zpracování nadřízených a podřízených pomocí klíčů –
klice.xsl
<?xml version="1.0" encoding="utf-8"?> <xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="1.0"> <xsl:output method="html" encoding="utf-8"/> <xsl:key name="zamestnanec" match="//zamestnanec" use="@oc"/> <xsl:key name="podrizeni" match="//zamestnanec" use="sef"/> <xsl:template match="/"> <html> <head> <title>Ukázka použití klíčů</title> </head> <body> <h1>Nadřízení</h1> <xsl:for-each select="//zamestnanec"> <xsl:value-of select="jmeno"/> - <xsl:value-of select="key('zamestnanec', sef)/jmeno"/> <br/> </xsl:for-each> <h1>Podřízení</h1> <xsl:for-each select="//zamestnanec"> <xsl:value-of select="jmeno"/> - <xsl:for-each select="key('podrizeni', @oc)"> <xsl:value-of select="jmeno"/>, </xsl:for-each> <br/> </xsl:for-each> </body> </html> </xsl:template> </xsl:stylesheet>
Klíče lze s výhodou využít i při seskupování při
použití metody, kterou navrhl Steve Muench. Základní idea je velmi
jednoduchá. Jestliže pro každou skupinu potřebujeme vybrat jen první
uzel, musí pro něj platit, že jeho identifikátor získaný funkcí
generate-id()
je shodný s identifikátorem
prvního uzlu vráceného funkcí key()
pro aktuální
hodnotu klíče skupiny.
Příklad 8.3. Seskupování pomocí klíčů –
citaty-podle-autoru7.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: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="//citat[generate-id(.) = generate-id(key('citaty',./autor)[1])]"> <xsl:sort select="autor"/> <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>