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-declarationatribut 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-systematribut obsahuje URI systémového identifikátoru, který ukazuje na DTD
doctype-publicveřejný identifikátor
standalonehodnota tohoto atributu je použita v odpovídajícím pseudoatributu XML deklarace
cdata-section-elementsjako hodnotu uvedeme seznam elementů, uvnitř nichž se mají
používat CDATA sekce místo znakových entit jako <, & apod.
media-typetímto atributem můžeme určit MIME typ generovaných dat
indentatribut 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>