Article Index

Šablony

Základem XSLT jsou šablony. Šablona je aktivována výskytem vybraného uzlu v XML (element, atribut, dokument, ...) a obsahuje reakci na výskyt tohoto uzlu. Šablona za určitých podmínek reaguje na každý výskyt dané značky.

Šablona může obsahovat statické zápisy (například HTML značky) a dynamickou část (zpracování nebo prezentace hodnot). Vezmeme si krátké ukázkové XML:

<zaznamy>
  <mereni id="001">
    <datum>2017-02-01</datum>
 
   <teplota>-3.6</teplota>
  </mereni>
</zaznamy>

Pokud budeme chtít zobrazit následující tabulku:

ID Datum Teplota
001 2017-02-01 -3,6

, musíme připravit XSL zápis:

<xsl:template match="/">
  <html>  <!-- Vložíme základní značky HTML -->
    <head><title>Měření teploty</title></head>
    <body>
      <table> <!-- Vložíme pevnou část s tabulkou a prvním řádkem -->
        <tr><td>ID</td><td>Datum</td><td>Teplota</td></tr>
        <tr> <!-- Vložíme druhý řádek a do něj natáhneme hodnoty z XML -->
          <td><xsl:value-of select="mereni/@id" /></td> <!-- Vložíme atribut id ze značky mereni -->
          <td><xsl:value-of select="mereni/datum" /></td> !-- Vložíme hodnotu značky datum potomka značky mereni -->
          <td><xsl:value-of select="mereni/teplota" /></td> !-- Vložíme hodnotu značky teplota potomka značky mereni -->
        </tr>
      </table>
    </body>
  </html>
</xsl:template>

Zde tedy začínáme doporučenou cestou - tedy pro vložení osnovy HTML dokumentu dáme první šablonu na / - tedy kořen dokumentu. Ekvivaletní dokument může být i při nastavení šablony na kořenovou značku <zaznamy>.

<xsl:template match="zaznamy">
  <html>  <!-- Vložíme základní značky HTML -->
    <head><title>Měření teploty</title></head>
    <body>
      <table> <!-- Vložíme pevnou část s tabulkou a prvním řádkem -->
        <tr><td>ID</td><td>Datum</td><td>Teplota</td></tr>
        <tr> <!-- Vložíme druhý řádek a do něj natáhneme hodnoty z XML -->
          <td><xsl:value-of select="mereni/@id" /></td> <!-- Vložíme atribut id ze značky mereni -->
          <td><xsl:value-of select="mereni/datum" /></td> !-- Vložíme hodnotu značky datum potomka značky mereni -->
          <td><xsl:value-of select="mereni/teplota" /></td> !-- Vložíme hodnotu značky teplota potomka značky mereni -->
        </tr>
      </table>
    </body>
  </html>
</xsl:template>

Třetí možností je začít reakcí na značku <mereni>.

<xsl:template match="zaznamy/mereni">
  <html>  <!-- Vložíme základní značky HTML -->
    <head><title>Měření teploty</title></head>
    <body>
      <table> <!-- Vložíme pevnou část s tabulkou a prvním řádkem -->
        <tr><td>ID</td><td>Datum</td><td>Teplota</td></tr>
        <tr> <!-- Vložíme druhý řádek a do něj natáhneme hodnoty z XML -->
          <td><xsl:value-of select="./@id" /></td> <!-- Vložíme atribut id ze značky mereni -->
          <td><xsl:value-of select="datum" /></td> !-- Vložíme hodnotu značky datum potomka značky mereni -->
          <td><xsl:value-of select="teplota" /></td> !-- Vložíme hodnotu značky teplota potomka značky mereni -->
        </tr>
      </table>
    </body>
  </html>
</xsl:template>

Zde dochází k úpravě adresování, neboť šablona reaguje na jinou než kořenovou značku a tak musíme upravit adresování. Zápis ./@id vybere atribut id z aktuální značky.

Co celému dokumentu chybí? Ještě musí být celý zápis dán do souboru i s hlavičkou XSL dokumentu.

<?xml version="1.0" encoding="UTF-8"?><!-- hlavička -->
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
                xmlns:xs="http://www.w3.org/2001/XMLSchema"
                exclude-result-prefixes="xs"
                version="2.0">
<xsl:template match="zaznamy/mereni">
  <html>  <!-- Vložíme základní značky HTML -->
    <head><title>Měření teploty</title></head>
    <body>
      <table> <!-- Vložíme pevnou část s tabulkou a prvním řádkem -->
        <tr><td>ID</td><td>Datum</td><td>Teplota</td></tr>
        <tr> <!-- Vložíme druhý řádek a do něj natáhneme hodnoty z XML -->
          <td><xsl:value-of select="./@id" /></td> <!-- Vložíme atribut id ze značky mereni -->
          <td><xsl:value-of select="datum" /></td> <!-- Vložíme hodnotu značky datum potomka značky mereni -->
          <td><xsl:value-of select="teplota" /></td> !-- Vložíme hodnotu značky teplota potomka značky mereni -->
        </tr>
      </table>
    </body>
  </html>
</xsl:template>
</xsl:stylesheet>

A ješte musíme propojit XML soubor s XSL souborem.

<?xml version="1.0" encoding="UTF-8"?>
  <?xml-stylesheet type="text/xsl" href="/data-simple.xsl"?>
  <zaznamy>
    <mereni id="001">
      <datum>2017-02-01</datum>
      <teplota>-3.6</teplota>
    </mereni>
</zaznamy>