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.

14.2 Seskupování uzlů

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/></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>

© 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