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.

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ů

Již jsme si říkali, že XSLT procesor je schopný generovat několik různých druhů výstupu – HTML, XML a textové soubory. Konkrétní formát výstupu se ovládá pomocí atributů instrukce <xsl:output>.

4.2.1 Výstupní metoda – method

Většina XSLT procesorů podporuje několik výstupních metod. Implicitně se většinou používá výstup do XML, výjimku tvoří styly, které jako první vygenerují element html.

method="html"

při tomto druhu výstupu se dodržují konvence jazyka HTML:

  • prázdné elementy se zapisují bez koncového lomítka (např. <br/> se převede na <br>);

  • provede se minimalizace atributů (např. místo compact="compact" se použije compact);

  • pro znaky z ISO Latin1 se použijí znakové entity (&copy;, &yacute; apod.).

method="xml"

použijí se konvence běžné v XML dokumentech

method="text"

na výstup se zapisují jen textové uzly výsledného dokumentu, neprovádí se žádná konverze na entity

Některé procesory podporují ještě další výstupní metody – například xhtml nebo uživatelem definované.

4.2.2 Kódování výstupního dokumentu – encoding

Otázka kódování je zvláště důležitá v našich podmínkách. Pokud kódování neurčíme, použije se implicitně UTF-8 nebo UTF-16 – záleží na konkrétním procesoru.

Pro nás jsou důležitá především kódování windows-1250 a iso-8859-2. V současné době již většina procesorů tato kódování podporuje.

Pokud chceme získat dokumenty v českém kódování, měli bychom použít obdobu následující instrukce:

<xsl:output method="html" encoding="windows-1250"/>

Další problém nastává v tom, že většina procesorů při výstupu do HTML nahrazuje znaky z ISO Latin1 entitami. Např. Saxon je s výše uvedenou deklarací schopný generovat podobné zrůdnosti:

<html>
   <head>
      <meta http-equiv="Content-Type" 
            content="text/html; charset=windows-1250">
      <title>Uk&aacute;zka k&oacute;dov&aacute;n&iacute;</title>
   </head>
   <body>
      P&#345;&iacute;li&#353; &#382;lu&#357;ou&#269;k&yacute; 
      k&#367;&#328; &uacute;p&#283;l &#271;&aacute;b&#283;lsk&eacute; 
      &oacute;dy.
   </body>
</html>

Jeho pravidla pro výstup do HTML mají vyšší prioritu, než kódování. Naštěstí v poslední verzi Saxonu existuje způsob, jak vypnout nahrazování znaků entitami.

Příklad 4.4. Nastavení výstupního kódování v Saxonu – kodovani2.xsl

<?xml version="1.0" encoding="utf-8"?>
<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" encoding="windows-1250" 
            saxon:character-representation="native"/>

<xsl:template match="/">
  <html>
    <head>
      <title>Ukázka kódování</title>
    </head>
    <body>
      Příliš žluťoučký kůň úpěl ďábělské ódy.
    </body>
  </html>
</xsl:template>

</xsl:stylesheet>

Upravená verze XT se takto chová standardně, není potřeba používat žádné další přídavné atributy. Dostaneme pak očekávaný výsledek. Procesor navíc při výstupní metodě HTML správně doplní meta-hlavičku s určením kódování – tuto informaci využívají webové prohlížeče a některé systémy pro dynamickou změnu kódu na straně serveru.

<html>
   <head>
      <meta http-equiv="Content-Type" 
            content="text/html; charset=windows-1250">
      <title>Ukázka kódování</title>
   </head>
   <body>
      Příliš žluťoučký kůň úpěl ďábělské ódy.
   </body>
</html>

Při výstupní metodě XML se všechny znaky dostupné v daném kódování zapíší přímo, ostatní znaky pomocí číselných znakových entit. Na začátek dokumentu se připojí správná XML deklarace s kódováním.

<?xml version="1.0" encoding="windows-1250"?>
<html><head><title>Ukázka kódování</title></head><body>
      Příliš žluťoučký kůň úpěl ďábělské ódy.
</body></html>

4.2.3 Generování XML deklarace a deklarace typu dokumentu

Při generování XML dokumentů můžeme použít několik dalších parametrů, které ovlivní výsledek:

version

číslo verze XML, dnes je implicitní verze 1.0

omit-xml-declaration

atribut může nabývat hodnot yes a no; když deklaraci vynecháme a použijeme jiné kódování než UTF-8 nebo UTF-16, můžeme dostat nesprávně strukturovaný dokument

doctype-system

atribut obsahuje URI systémového identifikátoru, který ukazuje na DTD

doctype-public

veřejný identifikátor

standalone

hodnota tohoto atributu je použita v odpovídajícím pseudoatributu XML deklarace

cdata-section-elements

jako hodnotu uvedeme seznam elementů, uvnitř nichž se mají používat CDATA sekce místo znakových entit jako &lt;, &amp; apod.

media-type

tímto atributem můžeme určit MIME typ generovaných dat

indent

atribut může nabývat hodnot yes a no, určuje zda se má výstupní dokument přehledně formátovat pomocí odsazování

Většinu z popsaných atributů využijeme například při generování WML kódu:

<xsl:output method="xml" encoding="us-ascii" indent="yes" 
            doctype-public="-//WAPFORUM//DTD WML 1.1//EN"
            doctype-system="http://www.wapforum.org/DTD/wml_1.1.xml"/>

Na začátku WML dokumentu pak dostaneme vše potřebné:

<?xml version="1.0" encoding="us-ascii"?>
<!DOCTYPE wml
  PUBLIC "-//WAPFORUM//DTD WML 1.1//EN" 
         "http://www.wapforum.org/DTD/wml_1.1.xml">

4.2.4 Výstup vyhrazených znaků

V některých situacích potřebujeme do dokumentu vložit přímo znaky <, > nebo třeba &. XSLT procesor je však při výstupní metodě HTML nebo XML automaticky nahradí odpovídající znakovou entitou (&lt;, &gt; a &amp;).

Toto chování procesoru lze dočasně vypnout pomocí atributu disable-output-escaping, který můžeme použít u instrukcí <xsl:text> a <xsl:value-of>.

Příklad 4.5. Výstup speciálních znaků – escape1.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="xml"/>

<xsl:template match="/">
  <doc><xsl:text disable-output-escaping="yes">&lt; - &gt; - &amp;</xsl:text></doc>
</xsl:template>

</xsl:stylesheet>

Na výstupu obdržíme následující dokument:

<?xml version="1.0" encoding="utf-8"?><doc>< - > - &</doc>

Varování

Při použití atributu disable-output-escaping můžeme velice snadno vygenerovat syntakticky nesprávné XML a HTML dokumenty, musíme si proto dát velký pozor. Atribut je lepší používat pouze v nezbytných případech.

Podobný přístup můžeme použít, když chceme do HTML dokumentu vložit nedělitelnou mezeru nebo jinou entitu.

Příklad 4.6. Zapsání &nbsp; do HTML – escape2.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"/>

<xsl:template match="/">
  <html>
    <body>
      V<xsl:text
        disable-output-escaping="yes">&amp;nbsp;</xsl:text>lese
    </body>
  </html>
</xsl:template>

</xsl:stylesheet>

Dostaneme pak požadovaný výstup:

<html>
   <body>
      V&nbsp;lese
   </body>
</html>

Stejný efekt lze dosáhnout i použitím číselné znakové entity &#160;, která reprezentuje znak nedělitelná mezera – XSLT procesor z něj automaticky udělá nedělitelnou mezeru (obdržíme tedy stejný výstup jako v předcházejícím případě).

Příklad 4.7. Zapsání &nbsp; do HTML elegantnějším způsobem – escape3.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"/>

<xsl:template match="/">
  <html>
    <body>
      V&#160;lese
    </body>
  </html>
</xsl:template>

</xsl:stylesheet>

Když vhodně využijeme vlastnosti interních textových entit a toho, že XSLT styl je XML dokumentem, můžeme nedělitelné mezery do dokumentu zapisovat zcela přirozeným způsobem.

Příklad 4.8. Zapsání &nbsp; do HTML nejelegantnějším způsobem – escape4.xsl

<?xml version="1.0" encoding="utf-8"?>
<!DOCTYPE xsl:stylesheet [
<!ENTITY nbsp "&#160;">
]>
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
                version="1.0">

<xsl:output method="html"/>

<xsl:template match="/">
  <html>
    <body>
      V&nbsp;lese
    </body>
  </html>
</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