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.

Kapitola 4. Ovládání chování XSLT procesoru

4.1. Kořenový element stylu – <xsl:stylesheet>
4.2. Ovládání formátu výstupního souboru
4.2.1. Výstupní metoda – method
4.2.2. Kódování výstupního dokumentu – encoding
4.2.3. Generování XML deklarace a deklarace typu dokumentu
4.2.4. Výstup vyhrazených znaků
4.3. Práce s bílými znaky
4.3.1. Bílé znaky ve stylu
4.3.2. Bílé znaky ve vstupním dokumentu
4.4. Přejmenování jmenných prostorů – <xsl:namespace-alias>
4.5. Výstup hlášení uživateli – <xsl:message>

Ty nejdůležitější XSLT instrukce pro generování stromu výstupního dokumentu jsme již probrali. K dispozici máme navíc několik instrukcí a parametrů, které ovlivňují způsob, jakým se vygenerovaný strom dokumentu zapíše do souboru.

4.1 Kořenový element stylu – <xsl:stylesheet>

U tohoto elementu musíme vždy použít atributy version a xmlns:xsl, které označují verzi XSLT a jednoznačně spojí prefix xsl se jmenným prostorem pro XSLT. Pokud chceme použít jiný prefix než xsl, stačí změnit jméno prefixu v deklaraci jmenného prostoru.

Synonymem k <xsl:stylesheet> je instrukce <xsl:transform>.

Stylu můžeme přiřadit jednoznačný identifikátor pomocí atributu id. To se hodí v případech, kdy máme v jednom souboru více stylů, nebo je styl obsažen ve stejném souboru jako dokument. V instrukci pro připojení stylu nebo jako parametr XSLT procesoru pak za URL adresu stylu uvedeme #id, a tím určíme, který styl se má použít. Ve stylu musíme rovněž atribut id definovat tak, aby jeho typ byl ID. Ne všechny XSLT procesory však tuto vlastnost podporují.

Příklad 4.1. Styl obsažený přímo v dokumentu XML – self.xml

<?xml version="1.0" encoding="utf-8"?>
<?xml-stylesheet href="#style" type="text/xsl"?>
<!DOCTYPE katalog [
<!ATTLIST xsl:stylesheet
          id ID #REQUIRED>
]>
<katalog>
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
                version="1.0"
                id="style">

  <xsl:output method="html" encoding="utf-8"/>

  <xsl:template match="xsl:stylesheet"/>  

  <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>
        
        <TABLE WIDTH="100%" BORDER="1">
          <xsl:apply-templates select="//polozka"/>
        </TABLE>
        
        <xsl:apply-templates select="//polozka" mode="detailni"/>       
      </BODY>
    </HTML>
  </xsl:template>
  
  <xsl:template match="polozka">
    <TR>
      <xsl:apply-templates select="nazev|kategorie|cena"/>
    </TR>
  </xsl:template>
  
  <xsl:template match="nazev">
    <TH><xsl:apply-templates/></TH>
  </xsl:template>
  
  <xsl:template match="kategorie">
    <TD align="right"><xsl:apply-templates/></TD>
  </xsl:template>
  
  <xsl:template match="cena">
    <TD align="right"><xsl:apply-templates/></TD>
  </xsl:template>

  <xsl:template match="polozka" mode="detailni">
    <xsl:apply-templates mode="detailni"/>
    <HR/>
  </xsl:template>
  
  <xsl:template match="nazev" mode="detailni">
    <H2><xsl:apply-templates mode="detailni"/></H2>
    <xsl:if test="../foto/@href">
      <IMG src="{../foto/@href}" alt="{.}" align="right"/>
    </xsl:if>
  </xsl:template>

  <xsl:template match="kategorie" mode="detailni">
    <EM><xsl:apply-templates mode="detailni"/></EM>
  </xsl:template>

  <xsl:template match="cena" mode="detailni">
    <STRONG> - <xsl:apply-templates mode="detailni"/></STRONG>
  </xsl:template>

  <xsl:template match="popis" mode="detailni">
    <P><xsl:apply-templates mode="detailni"/></P>
  </xsl:template>

  <xsl:template match="br" mode="detailni">
    <BR/>
  </xsl:template>
  
</xsl:stylesheet>
<info>
<firma>Sony</firma>
<adresa>Nedůležitá, NěkděTown</adresa>
<obdobi>zima 2001</obdobi>
</info>

<polozka kod="mxd-d4">
<nazev>MiniDisc kombinovaný s CD přehrávačem</nazev>
<kategorie>MiniDisc</kategorie>
<cena>14990</cena>
<popis>Kombinace MD a CD pro pohodlné nahrávání z CD<br/>
přepis <b>vysokou rychlostí</b> z CD<br/>nahrávání v LP režimu (4x)<br/>
20 bitový A/D převodník<br/>funkce Time Machine Recording<br/>
funkce sf Edit<br/>
nízká spotřeba v pohotovostním režimu</popis>
</polozka>

<polozka kod="mds-ja555es_n">
<nazev>MiniDisc rekordér řady ES</nazev>
<kategorie>MiniDisc</kategorie>
<cena>34990</cena>
<popis>plné editační možnosti<br/>
zásuvková mechanika pro vkládání
MD<br/>
Pitch Control<br/>
proudový pulsní D/A převodník<br/>
24bitový A/D převodník<br/>
digitální filtr s proměnným
koeficientem<br/>
dvojitý transformátor s kruhovým jádrem
(R-Core)<br/>
systém DSP ATRAC typu R<br/>
digitální ovládání záznamové úrovně<br/>
dva optické digitální výstupy + koaxiální
digitální vstup<br/>
ovládání A1 (Control A1)<br/>
provedení <b>ve zlaté
barvě</b></popis>
<foto href="MDSJA555ES_N.jpg"/>
</polozka>

<polozka kod="str-de135">
<nazev>Stereo receiver a zesilovač</nazev>
<kategorie>Receiver</kategorie>
<cena>5990</cena>
<popis>2 x 60W (DIN 4 Ohm)<br/>
3 audiovstupy<br/>tuner RDS/EON<br/>30 předvoleb, korekce tónu a
vyvážení<br/>digitální zpracování signálu - DSP<br/>
systémový dálkový ovladač </popis>
<foto href="STRDE135.jpg"/>
</polozka>

<polozka kod="mz-r90">
<nazev>MD Walkman</nazev>
<kategorie>MiniDisc</kategorie>
<cena>12990</cena>
<popis>MD Walkman s možností záznamu<br/>
<b>nejmenší na světě</b><br/>
tělo přístroje z magnézia - výjimečně nízká hmotnost<br/>
Pop Up Eject mechanismus<br/>až 14,5 hodin záznamu / 29 hodin reprodukce (Ni-MH + AA
baterie)<br/>
40 sec. ESP, Mega Bass<br/>
dálkové ovládání s podsvětleným LCD displejem (9 znaků) s editovacími
funkcemi<br/>možnost pojmenování skladeb a disku během záznamu<br/>
možnost monofonního záznamu v LP režimu
(až 160 min.)<br/>
LCD displej na přístroji<br/>
paměť pro často užívaná slova
(cca 40 výrazů po 10 znacích)<br/>možnost kopírování CD textu<br/>linkový
vstup / výstup, optický vstup, vstup pro mikrofon<br/>zásuvka pro
napájení ze sítě, AC adaptér, dobíjecí Ni-MH baterie</popis>
<foto href="MZR90.jpg"/>
</polozka>

<polozka kod="ss-mb215">
<nazev>3pásmové reproduktory</nazev>
<kategorie>Reproduktory</kategorie>
<cena>3990</cena>
<popis>párové, regálové, 3pásmové<br/>
max. zatížitelnost 120W<br/>impedance 8 Ohm<br/>
bassreflex<br/>magneticky stíněné<br/>
odnímatelné mřížky<br/>
rozměry: 220 x 518 x 230 mm</popis>
</polozka>

<polozka kod="ss-cr490">
<nazev>Sada AV reproduktorů</nazev>
<kategorie>Reproduktory</kategorie>
<cena>5990</cena>
<popis>2 x zadní, 1 x centrální, 2 pásmové<br/>
maximální zatížitelnost zadní: 120 W, centrální: 150 W<br/>
impedance 8 Ohm</popis>
</polozka>

</katalog>

Některé procesory nabízejí rozšiřující instrukce. Aby se tyto instrukce nemíchaly dohromady s XSLT instrukcemi, musí používat vlastní jmenný prostor. Musíme však XSLT procesoru nějak říci, že pod daným prefixem se skrývají rozšíření. K tomu slouží atribut extension-element-prefixes. Jako jeho hodnota se uvádí seznam prefixů jmenných prostorů, které má procesor rozeznávat jako prefixy pro rozšiřující instrukce.

Příklad 4.2. Definice prefixů použitých pro rozšiřující instrukce – ext.xsl

<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
                version="1.0"
                xmlns:saxon="http://icl.com/saxon"
                extension-element-prefixes="saxon">

<xsl:output method="html"/>

<xsl:template match="/">
  <html>
    <body>
      <saxon:entity-ref name="nbsp"/>
      <saxon:entity-ref name="copy"/>
    </body>
  </html>
</xsl:template>

</xsl:stylesheet>

Tento styl na výstupu vygeneruje následující HTML kód (pro libovolný vstupní dokument):

<html>
   <body>&nbsp;&copy;</body>
</html>

Kdybychom extension-element-prefixes nepoužili, dostaneme výstup, který jsme rozhodně asi nechtěli:

<html xmlns:saxon="http://icl.com/saxon">
   <body>
      <saxon:entity-ref name="nbsp"></saxon:entity-ref>
      <saxon:entity-ref name="copy"></saxon:entity-ref>
   </body>
</html>

XSLT procesor v něm elementy s prefixem saxon nerozeznal jako instrukce, které má zpracovávat.

Poslední atribut, který lze u <xsl:stylesheet> použít, má také mnoho společného se jmennými prostory. Jako hodnotu atributu exclude-result-prefixes můžeme uvést seznam prefixů jmenných prostorů. Deklarace těchto jmenných prostorů budou vypuštěny z generovaného dokumentu.

Příklad 4.3. Vynechání deklarací jmenných prostorů z výstupu – extns.xsl

<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
                version="1.0"
                xmlns:some="http://www.some.org/ns"
                exclude-result-prefixes="some">

<xsl:output method="html"/>

<xsl:template match="/">
  <html>
    <body>Ahoj <xsl:value-of select="/some:osoba/some:jmeno"/></body>
  </html>
</xsl:template>

</xsl:stylesheet>

Po spuštění tento styl vygeneruje následující výstup:

<html>
   <body>Ahoj xxx</body>
</html>

Kdybychom jmenný prostor some nevynechali z výstupu, dostaneme:

<html xmlns:some="http://www.some.org/ns">
   <body>Ahoj xxx</body>
</html>

Samotný obsah elementu xsl:stylesheet mohou tvořit následující instrukce:

  • pokud se použijí, musí být na začátku všechny instrukce <xsl:import>;

  • v libovolném pořadí pak můžeme použít následující instrukce:

    • <xsl:attribute-set>

    • <xsl:include>

    • <xsl:key>

    • <xsl:decimal-format>

    • <xsl:namespace-alias>

    • <xsl:output>

    • <xsl:preserve-space>

    • <xsl:strip-space>

    • <xsl:template>

    • <xsl:param> – instrukci můžeme používat i jinde, než jen jako instrukci na nejvyšším místě

    • <xsl:variable> – instrukci můžeme používat i jinde, než jen jako instrukci na nejvyšším místě

© 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