XSLT tutorial
Generování statických HTML stránek s navigací pomocí XSLT

Následující text Vám ukáže, jak vytvořit jednoduchý vícestránkový web s navigací pomocí XSLT. Výsledný web je zobrazen na následujícím obrázku:

Obsah
Úvod
Strana dvě
Strana tři
Úvod
Text text text text text text text
text text text text text

Dynamický nebo statický web?

Při tvorbě statického webu v HTML je nutno opakovat v každém HTML souboru společné prvky typu navigace, hlavička a další. Pokud v navigaci budeme zvýrazňovat aktivní stranu, znamená to nejen kopírování ale i ruční editaci. Při změně názvu jedné strany je pak nutno změnit obsah ve všech HTML souborech.

Typicky je tento problém řešen použitím dynamického webu (PHP, ASP, ...), kdy je obsah programově načítán z databáze a dynamicky zobrazován včetně generované navigace. Pro úpravu obsahu webu je třeba použít nějaké administrační rozhraní pro práci s texty v databázi. Pro jednoduchý web je toto poměrně náročná infrastruktura a změny v designu webu často vyžadují její úpravu.

XSLT pro generování webu

Pro efektivní tvorbu a správu menšího webu se hodí technologie XSLT. Umožňuje zabránit zmíněným komplikacím v podobě náročné údržby čistě statického webu a potřeby administračního rozhraní dynamického webu. Navíc poskytne značnou flexibilitu při úpravách rozvržení webu.

Při použití XSLT je vlastní obsah stran webu a strukturovanou informaci jako nadpisy a názvy výsledných HTML stran uložíme do XML souboru dle vlastního formátu. Generování jednotlivých stran včetně požadovaného rozvržení zajistí XSLT soubor, který dokáže naší strukturu XML souboru interpretovat a vytvoří navigaci na každou stranu. Tímto způsobem můžeme holý obsah editovat obyčejným textovým editorem v XML souboru a vzhledové vlastnosti nezávisle v XSLT souboru. XSLT soubor je obvykle podstatně jednodušší než dynamické např. PHP strany a XML soubor zase nahrazuje databázi.

Převod dvojice XML a XSLT na sadu výsledných HTML souborů zajistí vhodný XSLT procesor, například Saxon. HTML soubory pak již můžeme uploadnout na webserver a web je hotový.

Příklad

XML soubor web.xml

<site>
        <page file="index.htm" title="Úvod">
                Zde je úvodní <b>text</b> text text text text text text text text text text text text text text text text
        </page>
        <page file="druha.htm" title="Druhá strana">
                Zde je druhý text text text text text text text text text text text text text text text text text
        </page>
        <page file="treti.htm" title="Třetí strana">
                Zde je třetí text text text text text text text text text text text text text text text text text
        </page>
</site>
        
        

XSLT soubor web.xslt

<?xml version="1.0" encoding="UTF-8"?>
<!-- hlavička XSLT a volba výstupu do HTML a podobně -->
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="2.0" xmlns:saxon="http://saxon.sf.net/" exclude-result-prefixes="saxon">
  <xsl:output method="html" version="4.01" encoding="UTF-8" indent="yes" doctype-public="-//W3C//DTD HTML 4.01//EN" 
    doctype-system="http://www.w3.org/TR/html4/strict.dtd" saxon:character-representation="native;entity;decimal" />
  
  <!-- XSLT bude operovat na elementech <page> zdrojového XML -->
  <xsl:template match="page"> 
    <!-- Pro ladící účely si vypíšeme právě zpracovávanou stranu -->
    <xsl:message>Zpracovavam: <xsl:value-of select="@file"/></xsl:message>
    <!-- Nastavíme výstupní dokument dle atributu file, odkazovaný xpath výraz musí být ve složených závorkách -->
    <xsl:result-document href="{@file}">
      <!-- Následuje běžné html obsahující xsl elementy pro vkládání obsahu ze zdrojového xsl -->
      <html>
        <head>
          <title>
            <!-- Určíme title strany, xsl element <value-of> očekává v atributu select vyraz xpath -->
            <xsl:value-of select="@title"/>
          </title>
        </head>
        <body>
          <div style="float:left; margin-right:5ex">
            Obsah
            <ul>
              <!-- na cely xml soubor necháme použít šablony v modu "obsah" -->
              <xsl:apply-templates select="/" mode="obsah">
                <!-- abychom mohli zvýraznit aktuálni stranu, předáme ji jako parametr -->
                <xsl:with-param name="actpage">
                  <xsl:value-of select="@file"/>
                </xsl:with-param>
              </xsl:apply-templates>

            </ul>
          </div>
          <h1>
            <xsl:value-of select="@title"/>
          </h1>
          <!-- vlozime cely obsah aktuálního elementu <page> funkci node() -->
          <xsl:copy-of select="node()"/>
        </body>
      </html>
    </xsl:result-document>
  </xsl:template>

  <!-- šablona aktivní pouze v modu obsah -->
  <xsl:template match="page" mode="obsah">
    <!-- uvedeme přebíraný parametr -->
    <xsl:param name="actpage"/>
    <li>
      <!-- rozlišení aktivní a neaktivní strany dle předaného parametru -->
      <xsl:choose>
        <xsl:when test="@file=$actpage">
          <b>
            <xsl:value-of select="@title"/>
          </b>
        </xsl:when>
        <xsl:otherwise>
          <a href="{@file}">
            <xsl:value-of select="@title"/>
          </a>
        </xsl:otherwise>
      </xsl:choose>
    </li>
  </xsl:template>

</xsl:stylesheet>


Kompilace

Nejprve je třeba stáhnout kompilační nástroj pro XSLT. Vhodný je například Saxon. Saxon vyžaduje nainstalovanou Javu. Kompilaci spustíme příkazem
java -jar saxon9.jar web.xml web.xsl

Po kompilaci vzniknou soubory index.htm, druha.htm, treti.htm, které obsahují navigaci a jsou vzájemně propojené. Prohlédnout si web můžete zde. Ke stažení jsou i zdrojové soubory web.xml a web.xsl.

Závěr

Tento článek ukázal možnost jednoduše generovat statický web. Pro mnoho případů je tato varianta výhodná, neboť nevyžaduje žádné programování dynamického webu a tvorbu databáze. Databáze je nahrazena XML souborem a program XSLT souborem. XSLT poskytuje obrovskou flexibilitu při úpravách rozložení a vzhledu výsledných HTML souborů.

 

Diskuse

Datum: 12/06/2010 11:50   Autor: Auriol   (ip: 188.246.111.65)
Předmětu: XSLT kompilátor
Zajímavý tutoriál, bohužel free verze Saxonu to zkomilovat neumí, pouze placená. Existuje nějaká free alternativa.

Datum: 13/06/2010 19:55   Autor: Mirek   (ip: 89.203.134.130)
Předmětu: XSLT kompilátor
Vše v tomto tutoriálu je kompilováno s free verzí Saxonu. Kde je konkrétně problém?

Datum: 14/06/2010 17:52   Autor: Auriol   (ip: 188.246.111.65)
Předmětu: XSLT kompilátor
Stáhnul jsem si bezplatnou edici, kde se ale soubor nejmenuje \"saxon9.jar\", nýbrž \"saxon9he.jar\" (\"he\" jako Home Edition). Na základě odlišného jména programu jsem se domníval že váš tutoriál pracuje s jinou verzí Saxonu, než je ta free.

Datum: 14/06/2010 17:53   Autor: Auriol   (ip: 188.246.111.65)
Předmětu: XSLT kompilátor
Upravit příkazový řádek a změnit saxon9.jar na saxon9he.jar jsem samozřejmě zkusil.

Datum: 14/06/2010 17:54   Autor: Auriol   (ip: 188.246.111.65)
Předmětu: XSLT kompilátor
Myslel jsem, že vy jste to zkomiloval s placenou verzí PE nebo EE, protože s verzí HE to vypisuje tyto chyby:

Datum: 14/06/2010 17:54   Autor: Auriol   (ip: 188.246.111.65)
Předmětu: XSLT kompilátor
Error at xsl:output on line 5 column 115 of web.xsl:

Datum: 14/06/2010 17:55   Autor: Auriol   (ip: 188.246.111.65)
Předmětu: XSLT kompilátor
XTSE0020: Serialization parameter {{http://saxon.sf.net/}characte...} is not available in Saxon-HE

Datum: 14/06/2010 17:56   Autor: Auriol   (ip: 188.246.111.65)
Předmětu: XSLT kompilátor
Takže mě napadá jedině to, že jste to kompiloval s nějakou starší free verzí, která to ještě pobrala.

Datum: 14/06/2010 17:57   Autor: Auriol   (ip: 188.246.111.65)
Předmětu: XSLT kompilátor
P.S.: Sorry že to píšu na x krát, ale najedenkrát mě to tady ten formulář nepobere.

Datum: 14/06/2010 23:48   Autor: Mirek   (ip: 89.203.134.130)
Předmětu: XSLT kompilátor
Díval jsem se na web Saxonu a od verze 9.2 osekali tu free verzi. Tutorial určitě funguje s verzí 9.0 a asi i s 9.1. Tyto starší verze se dají stáhnout na http://sourceforge.net/projects/saxon/files/ ve složce Saxon-B.

Datum: 14/06/2010 23:52   Autor: Mirek   (ip: 89.203.134.130)
Předmětu: Diskuse
Díky za info o chybě v diskusi

Datum: 15/06/2010 0:05   Autor: Mirek   (ip: 89.203.134.130)
Předmětu: Diskuse
Ted uz
vice radkovy
prispevek funguje.

Datum: 15/06/2010 0:12   Autor: Mirek   (ip: 89.203.134.130)
Předmětu: XSLT kompilátor
Konkretne funkcni by mel byt tento Saxon:
http://sourceforge.net/projects/saxon/files/Saxon-B/9.0.0.8/saxonb9-0-0-8j.zip/download

Přidat příspěvek