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>
.
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 (©
, ý
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é.
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ázka kódování</title> </head> <body> Příliš žluťoučký kůň úpěl ďábělské ó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>
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 <
, &
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">
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
(<
, >
a &
).
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">< - > - &</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>
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í
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">&nbsp;</xsl:text>lese </body> </html> </xsl:template> </xsl:stylesheet>
Dostaneme pak požadovaný výstup:
<html> <body> V lese </body> </html>
Stejný efekt lze dosáhnout i použitím číselné znakové entity
 
, 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í
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 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í
do HTML
nejelegantnějším způsobem – escape4.xsl
<?xml version="1.0" encoding="utf-8"?> <!DOCTYPE xsl:stylesheet [ <!ENTITY nbsp " "> ]> <xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="1.0"> <xsl:output method="html"/> <xsl:template match="/"> <html> <body> V lese </body> </html> </xsl:template> </xsl:stylesheet>