Potřebujete pomoci s XSLT?
Nabízím školení, konzultace, vývoj XSLT kódu na zakázku. Nevájte a kontaktujte mne.

Podpořte provoz stránek
Platba probíhá pomocí služby PayPal a je možné platit kartou nebo převodem z vašeho PayPal účtu.

Kapitola 8. Použití klíčů pro odkazování v dokumentu

8.1. Využití klíčů pro seskupování dat

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:

Oproti ID/IDREF mechanismu tu máme hned několik výhod:

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>

8.1 Využití klíčů pro seskupování dat

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>

© Jiří Kosek 2014

Tento dokument je určen výhradně pro osobní potřebu seznámení s jazykem XSLT. Jakékoliv jiné použití, včetně dalšího šíření, pořizování kopií, použití při školeních a výuce apod. je výslovně zakázáno a bude považováno za porušení autorských práv.


Copyright © 2000-2014 Jiří Kosek