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.

7.2 Automatické číslování

Pomocí instrukce <xsl:number>, můžeme do dokumentu automaticky vkládat čísla. Instrukce se používá pro takové věci, jako je automatické číslování kapitol, obrázků apod.

Nejjednodušší způsob použití instrukce je v případech, kdy známe hodnotu, kterou chceme do dokumentu vložit, v tom případě použijeme instrukci následujícím způsobem:

<xsl:number value="výraz"
            format="specifikace formátu"/>

V tomto případě je výraz vyhodnocován ve stejném kontextu, jako ostatní výrazy v jiných instrukcích.

Příklad 7.3. Ruční číslování – citaty-podle-abecedy-cislovane.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:template match="/citaty">
  <html>
    <head>
      <title>Citáty podle abecedy</title>
    </head>
    <body>
      <xsl:for-each select="citat">
        <xsl:sort select="text"/>
        <p>
          <xsl:number value="position()" format="I. "/>
          <xsl:value-of select="text"/>
          <xsl:text> - </xsl:text>
          <xsl:value-of select="autor"/>
        </p>
      </xsl:for-each>
    </body>
  </html>
</xsl:template>

</xsl:stylesheet>

Pokud nepoužijeme atribut value, je výpočet čísla na první pohled poměrně komplikovaný, leč o to mocnější.

count

Jako hodnota se udává výraz, který určuje uzly, které se mají započítávat. Pokud atribut nepoužijeme, počítají se jen uzly stejného jména a typu jako aktuální uzel.

from

Určuje, od jakého uzlu se má počítat. Některé způsoby číslování číslují od začátku dokumentu. Pokud použijeme from, čísluje se pouze od nejbližšího předka, který vyhovuje zadanému výrazu.

level="single"

Vrátí počet uzlů, které vyhovují podmínce count a jsou to předcházející sourozenci, zvětšený o jedna. Čísluje se na jedné úrovni.

level="any"

Narozdíl od předchozího případu jsou započítávány všechny předchozí uzly a předkové.

level="multiple"

Asi nejsložitější případ. Jsou vybráni všichni předkové, kteří vyhovují podmínce v count. Pro každého z nich se spočítá číslo podobně jako u level="single".

Jednotlivé typy číslování ilustrují následující příklady.

Příklad 7.4. Příklad číslování všech úrovní – num1.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:template match="/">
  <html>
    <body>
      <xsl:apply-templates/>
    </body>
  </html>
</xsl:template>

<xsl:template match="*">
  <xsl:number count="*" level="any" format="1. "/>
  <xsl:value-of select="name(.)"/><br/>
  <xsl:apply-templates/>
</xsl:template>

<xsl:template match="text()"/>

</xsl:stylesheet>

Příklad 7.5. Příklad víceúrovňového číslování – num2.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:template match="/">
  <html>
    <body>
      <xsl:apply-templates/>
    </body>
  </html>
</xsl:template>

<xsl:template match="*">
  <xsl:number count="*" level="multiple" format="1. "/>
  <xsl:value-of select="name(.)"/><br/>
  <xsl:apply-templates/>
</xsl:template>

<xsl:template match="text()"/>

</xsl:stylesheet>

Příklad 7.6. Příklad nulování čítačů – num3.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:template match="/">
  <html>
    <body>
      <xsl:apply-templates/>
    </body>
  </html>
</xsl:template>

<xsl:template match="*">
  <xsl:number count="*" level="multiple" from="polozka" format="1. "/>
  <xsl:value-of select="name(.)"/><br/>
  <xsl:apply-templates/>
</xsl:template>

<xsl:template match="text()"/>

</xsl:stylesheet>

Příklad 7.7. Výběr uzlů k započítání – num4.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:template match="/">
  <html>
    <body>
      <xsl:apply-templates/>
    </body>
  </html>
</xsl:template>

<xsl:template match="*">
  <xsl:number count="*[name(.)!='br']" level="multiple" 
              from="polozka" format="1. "/>
  <xsl:value-of select="name(.)"/><br/>
  <xsl:apply-templates/>
</xsl:template>

<xsl:template match="text()"/>

</xsl:stylesheet>

Příklad 7.8. Formátování čísla – num5.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:template match="/">
  <html>
    <body>
      <xsl:apply-templates/>
    </body>
  </html>
</xsl:template>

<xsl:template match="*">
  <xsl:number count="*" level="multiple" format="1-a*A---i.I.) "/>
  <xsl:value-of select="name(.)"/><br/>
  <xsl:apply-templates/>
</xsl:template>

<xsl:template match="text()"/>

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