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.

13.2 Množinové operace

13.2.1. set:difference
13.2.2. set:distinct
13.2.3. set:has-same-node
13.2.4. set:intersection
13.2.5. set:leading
13.2.6. set:trailing
Jmenný prostor

http://exslt.org/sets

Typický prefix

set

13.2.1 set:difference

Rozdíl mezi dvěma množinami uzlů.

seznam uzlů set:difference(seznam uzlů, seznam uzlů)

13.2.2 set:distinct

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>

13.2.3 set:has-same-node

Test, zda dva seznamy uzlů obsahují alespoň jeden stejný uzel.

boolean set:has-same-node(seznam uzlů, seznam uzlů)

13.2.4 set:intersection

Vrací průnik dvou množin uzlů.

seznam uzlů set:intersection(seznam uzlů, seznam uzlů)

13.2.5 set:leading

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.

13.2.6 set:trailing

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.

© 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