Obsah
Průběh formátování pomocí XSL stylů lze řídit mnoha parametry. Kompletní přehled parametrů je v dokumentaci ke stylům [XSL-DOC]. Složitější úpravy je nutné naprogramovat přímo v XSL [REC-XSLT], [XSL-FO].
Pokud chceme upravit chování stylu, musíme si vytvořit nový styl. Ten přitom naimportuje původní styl a předefinuje potřebné parametry. XSLT styly jsou XML dokumenty, které obsahují instrukce pro XSLT procesor a tagy, které se mají generovat (HTML, FO apod.).
<?xml version="1.0" encoding="windows-1250"?> <xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="1.0"> <xsl:import href="file:///c:/docbook/xsl/html/docbook.xsl"/> <!-- Úpravy parametrů --> </xsl:stylesheet>
Musíme samozřejmě u xsl:import
upravit cestu tak, aby ukazovala
na místo, kde se na našem systému nachází styl, ze kterého vycházíme.
Cestu ke stylu musíme zapisovat jako URL adresu, proto je na začátku
poněkud nezvyklé file:///
. Pokud
máme správně nastavené katalogové soubory, je vhodné styly
identifikovat URL adresou, na které jsou dostupné odkudkoliv z
Internetu. Naše úpravy stylů pak budou snáze přenositelné mezi
systémy.
<?xml version="1.0" encoding="windows-1250"?> <xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="1.0"> <xsl:import href="http://docbook.sourceforge.net/release/xsl/current/html/docbook.xsl"/> <!-- Úpravy parametrů --> </xsl:stylesheet>
I v XSL máme dva druhy stylů – pro tisk (formátovací
objekty – adresář fo
) a pro HTML (adresář
html
) – které jsou zcela samostatné.
Když chceme pomocí upraveného stylu zformátovat nějaký dokument, předáme XSLT procesoru jako parametr náš styl:
saxon -o prvni.html prvni.xml html.xsl
Následující příklad ukazuje, jak se dají změnit nejběžnější parametry. Výběr parametrů zpočátku nebyl tak bohatý jako u DSSSL, ale vývoj XSL FO stylů pokračuje velice rychle a již dnes jsou mnohem lépe parametrizovatelné než DSSSL styly.
Příklad 6.1. Úprava XSL stylu pro tisk – tisk.xsl
<?xml version="1.0" encoding="utf-8"?> <xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="1.0"> <xsl:import href="http://docbook.sourceforge.net/release/xsl/current/fo/docbook.xsl"/> <!-- Úpravy parametrů --> <!-- Velikost papíru --> <xsl:param name="paper.type" select="'A4'"/> <!-- XSLT procesor může používat rozšíření pro callouts apod. --> <xsl:param name="use.extensions" select="1"/> <!-- Rozšíření specifická pro daný FO procesor --> <!-- <xsl:param name="passivetex.extensions" select="1"/> --> <xsl:param name="xep.extensions" select="1"/> <!-- Velikost písma textu --> <xsl:param name="body.font.master">11</xsl:param> <!-- Velikost okrajů --> <xsl:param name="page.margin.inner" select="'1in'"/> <xsl:param name="page.margin.outer" select="'1in'"/> <!-- Číslování sekcí a kapitol --> <xsl:param name="section.autolabel" select="1"/> <xsl:param name="section.label.includes.component.label" select="1"/> <xsl:param name="chapter.autolabel" select="1"/> <xsl:param name="appendix.autolabel" select="1"/> <xsl:param name="part.autolabel" select="1"/> <xsl:param name="preface.autolabel" select="0"/> <!-- Nechceme obrázek --> <xsl:param name="draft.watermark.image" select="''"/> <!-- Nadpisy jsou zarovnány s textem, jak je zvykem v evropské typografii --> <xsl:param name="body.start.indent" select="'0pt'"/> </xsl:stylesheet>
Princip úprav je stejný jako u stylu pro tisk. Stačí změnit načítaný styl a podívat se do dokumentace, které parametry máme k dispozici.
Příklad 6.2. Úprava XSLT stylu pro generování HTML – html.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:import href="http://docbook.sourceforge.net/release/xsl/current/html/docbook.xsl"/> <!-- Úpravy parametrů --> <!-- Změna výstupního kódování --> <xsl:output method="html" encoding="iso-8859-2" saxon:character-representation="native"/> <!-- Mají se používat rozšíření --> <xsl:param name="use.extensions" select="1"/> <!-- Mají se sekce automaticky číslovat --> <xsl:param name="section.autolabel" select="1"/> <!-- Mají čísla sekcí obsahovat i čísla kapitol --> <xsl:param name="section.label.includes.component.label" select="1"/> <!-- Mají se číslovat kapitoly --> <xsl:param name="chapter.autolabel" select="1"/> </xsl:stylesheet>
XSLT styly používají různé styly pro generování jedné HTML stránky a celé sady HTML stránek. Pokud chceme sdílet nastavení parametrů pro oba dva režimy, můžeme nastavení uložit do samostatného souboru.
Příklad 6.3. Styl se sdílenými úpravami parametrů – html-common.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"> <!-- Úpravy parametrů --> <!-- Změna výstupního kódování --> <xsl:output method="html" encoding="iso-8859-2" saxon:character-representation="native"/> <!-- Mají se používat rozšíření --> <xsl:param name="use.extensions" select="1"/> <!-- Mají se sekce automaticky číslovat --> <xsl:param name="section.autolabel" select="1"/> <!-- Mají čísla sekcí obsahovat i čísla kapitol --> <xsl:param name="section.label.includes.component.label" select="1"/> <!-- Mají se číslovat kapitoly --> <xsl:param name="chapter.autolabel" select="1"/> <!-- Mají se vypnout navigační lišty --> <xsl:param name="suppress.navigation">0</xsl:param> </xsl:stylesheet>
Tento styl pak můžeme načítat pomocí xsl:include
.
Příklad 6.4. Styl pro HTML využívající společná nastavení – html-normal.xsl
<?xml version="1.0" encoding="utf-8"?> <xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="1.0"> <xsl:import href="http://docbook.sourceforge.net/release/xsl/current/html/docbook.xsl"/> <xsl:include href="html-common.xsl"/> </xsl:stylesheet>
Příklad 6.5. Styl pro sadu HTML stránek využívající společná nastavení a
přidávající pár dalších nastavení – html-chunk.xsl
<?xml version="1.0" encoding="utf-8"?> <xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="1.0"> <xsl:import href="http://docbook.sourceforge.net/release/xsl/current/html/chunk.xsl"/> <xsl:include href="html-common.xsl"/> <!-- Kódování výstupních HTML stránek --> <xsl:param name="chunker.output.encoding" select="'windows-1250'"/> <xsl:param name="saxon.character.representation" select="'native'"/> <!-- Přípona pro generované soubory --> <xsl:param name="html.ext" select="'.html'"/> <!-- Název hlavního souboru --> <xsl:param name="root.filename" select="'index'"/> <!-- Adresář, kam se mají ukládat vygenerované stránky --> <xsl:param name="base.dir" select="''"/> <!-- Do jaké hloubky se mají vytvářet chunky pro sekce (0 = chunky se vytvářejí pouze na úrovni kapitol) --> <xsl:param name="chunk.section.depth" select="1"/> <!-- Má první sekce kapitoly tvořit samostatný chunk --> <xsl:param name="chunk.first.sections" select="'0'"/> </xsl:stylesheet>
HTML Help je založen na výstupu do HTML a můžeme proto použít
všechny parametry, které známe ze stylů pro výstup do HTML a pro
chunkované HTML. Navíc lze použít několik dalších parametrů, které
ilustruje následující příklad. Pro české texty je důležité zejména
správné nastavení parametrů chunker.output.encoding
,
htmlhelp.encoding
a
saxon.character.representation
.
Příklad 6.6. Parametry pro výstup do HTML Helpu – htmlhelp.xsl
<?xml version="1.0" encoding="utf-8"?> <xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="1.0"> <xsl:import href="http://docbook.sourceforge.net/release/xsl/current/htmlhelp/htmlhelp.xsl"/> <!-- Kódování řídících souborů --> <xsl:param name="htmlhelp.encoding" select="'windows-1250'"/> <!-- Kódování výstupních HTML stránek --> <xsl:param name="chunker.output.encoding" select="'windows-1250'"/> <xsl:param name="saxon.character.representation" select="'native'"/> <!-- Mají se číslovat položky v obsahu --> <xsl:param name="htmlhelp.autolabel" select="0"/> <!-- Jméno výsledného CHM souboru --> <xsl:param name="htmlhelp.chm" select="'napoveda.chm'"/> <!-- Jméno projektového souboru --> <xsl:param name="htmlhelp.hhp" select="'htmlhelp.hhp'"/> <!-- Jméno souboru s obsahem --> <xsl:param name="htmlhelp.hhc" select="'toc.hhc'"/> <!-- Tlačítko pro skok na domovskou stránku --> <xsl:param name="htmlhelp.button.home">1</xsl:param> <xsl:param name="htmlhelp.button.home.url">http://www.kosek.cz</xsl:param> </xsl:stylesheet>
Chceme-li sdílet nastavení běžných parametrů pro výstup do
HTML i s výstupem do HTML Helpu, můžeme použít stejný mechanismus jako
dříve (využití instrukce xsl:include
).
Pří úpravách stylů se využívá toho, že naše šablony mají
přednost před těmi naimportovanými. Pokud se nám nelíbí, jak se
zpracovává nějaký element, stačí si zkopírovat odpovídající šablonu
z originálních XSL stylů a upravit ji. To používáme
v následující úpravě, která je schopná text uzavřený mezi
<phrase role="important">
a
</phrase>
zobrazit
tučně.
Příklad 6.7. Úprava složitějšího pravidla z XSL stylu – tiskml.xsl
<?xml version="1.0" encoding="utf-8"?> <xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="1.0"> <xsl:import href="http://docbook.sourceforge.net/release/xsl/current/fo/docbook.xsl"/> <!-- Úpravy parametrů --> <!-- Velikost papíru --> <xsl:param name="paper.type" select="'A4'"/> <!-- XSLT procesor může používat rozšíření pro callouts apod. --> <xsl:param name="use.extensions" select="1"/> <!-- Nechceme obrázek --> <xsl:param name="draft.watermark.image" select="''"/> <!-- Rozšíření specifická pro daný FO procesor --> <xsl:param name="xep.extensions" select="1"/> <!-- Upravená šablona pro <phrase role="important"> --> <xsl:template match="phrase"> <xsl:choose> <xsl:when test="@role='important'"> <xsl:call-template name="inline.boldseq"/> </xsl:when> <xsl:otherwise> <xsl:call-template name="inline.charseq"/> </xsl:otherwise> </xsl:choose> </xsl:template> </xsl:stylesheet>
Automaticky generované texty pro češtinu jsou uloženy
v souboru common/cs.xml
.
Upravovat přímo lokalizační soubor není dobrý nápad, protože při
aktualizaci stylů o naše úpravy přijdeme. XSL styly proto nabízejí
mnohem elegantnější způsob předefinování některých textů. Ve stylu
stačí nastavit parametr local.l10n.xml
tak, aby
ukazoval na XML dokument s lokalizačními úpravami. Soubor
s úpravami pak má stejnou strukturu jako originální lokalizace.
Díky mechanismu jmenných prostorů můžeme tento soubor zařadit přímo do
stylu nastavujícího ostatní parametry.
Příklad 6.8. Doplnění čísla obrázku v odkazu o název obrázku
– tiskcs.xsl
<?xml version="1.0" encoding="utf-8"?> <xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="1.0"> <xsl:import href="http://docbook.sourceforge.net/release/xsl/current/fo/docbook.xsl"/> <!-- Úpravy parametrů --> <!-- Velikost papíru --> <xsl:param name="paper.type" select="'A4'"/> <!-- XSLT procesor může používat rozšíření pro callouts apod. --> <xsl:param name="use.extensions" select="1"/> <!-- Z jakého dokumentu se bude číst uživatelská změna lokalizace --> <xsl:param name="local.l10n.xml" select="document('')"/> <!-- Lokalizační dokument může být přímo součástí stylu --> <i18n xmlns="http://docbook.sourceforge.net/xmlns/l10n/1.0"> <!-- Jazyk lokalizace --> <l10n language="cs"> <!-- Úprava šablon pro křížové odkazy --> <context name="xref-number-and-title"> <template name="figure" text="%n (%t)"/> </context> </l10n> </i18n> <!-- Nechceme obrázek --> <xsl:param name="draft.watermark.image" select="''"/> </xsl:stylesheet>
Lokalizační soubory obsahují několik dalších kontextů. Mezi
nejzajímavější patří asi title-numbered
a title-unnumbered
, které se používají pro nadpisy
s číslem, resp. bez čísla.
HTML stránky generované pomocí stylů používají pouze základní
HTML značkování, nijak nemění barvy, použitá písma apod. Implicitní
vzhled HTML stránek v prohlížečích není zrovna dvakrát oslňující,
navíc pro čtení na obrazovce jsou vhodnější bezpatková písma. Styly
umožňují pomocí parametru zadat jméno souboru s kaskádovým stylem
(CSS). Odkaz na něj se pak automaticky vloží do každé generované
stránky. Navíc styly většinu kontejnerových elementů uzavírají do
elementu div
a nastavují u něj třídu na jméno
shodné s názvem původního docbookového elementu. Například každá
kapitola je uzavřena v následující obálce:
<div class="chapter"> ... </div>
Toho pak můžeme využít v kaskádovém stylu. Na příkladě 6.9 – „Ukázkový kaskádový styl – docbook.css
“ je ukázáno použití této vlastnosti.
Příklad 6.9. Ukázkový kaskádový styl – docbook.css
body { font-family: Verdana, Helvetica CE, Arial CE, Arial, Helvetica, sans-serif; font-size: 9pt; background-color: white; color: black; margin: 0px; } table { font-size: 9pt } .title, .subtitle { color: navy } .programlisting, .programlistingco, .screen { background-color: #d0d0d0; padding: 5pt; margin: 5pt} :hover { color: red; text-decoration: underline; } a { text-decoration: none; color: blue; } .navfooter, .navheader { background-color: #EEDDFF; } .chapter, .refentry, .book, .reference, .preface, .colophon { margin-left: 10pt; margin-right: 10pt; }
Pro automatické zařazení odkazu na styl do všech stránek stačí
do parametru html.stylesheet
uložit cestu
k CSS souboru. Např.:
<xsl:param name="html.stylesheet">docbook.css</xsl:param>
U nejpoužívanějších elementů lze jejich vzhled měnit i jednodušeji než změnou celé šablony. V našem stylu s úpravami můžeme předefinovat množinu atributů, která reprezentuje vlastnosti FO aplikované na daný element. Kdybychom například chtěli mít všechny nadpisy sekcí první úrovně vycentrované a navíc červené, použijeme:
<xsl:attribute-set name="section.title.level1.properties"> <xsl:attribute name="color">red</xsl:attribute> <xsl:attribute name="text-align">center</xsl:attribute> </xsl:attribute-set>
Příklad 6.10. Změna tištěného výstupu pomocí vlastností FO – tisk-vlastnosti.xsl
<?xml version="1.0" encoding="utf-8"?> <xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="1.0"> <xsl:import href="http://docbook.sourceforge.net/release/xsl/current/fo/docbook.xsl"/> <!-- Úpravy parametrů --> <!-- Velikost papíru --> <xsl:param name="paper.type" select="'A4'"/> <!-- XSLT procesor může používat rozšíření pro callouts apod. --> <xsl:param name="use.extensions" select="1"/> <!-- Nechceme obrázek --> <xsl:param name="draft.watermark.image" select="''"/> <!-- Rozšíření specifická pro daný FO procesor --> <xsl:param name="xep.extensions" select="1"/> <!-- Snadná změna vzhledu vybraných elementů pomocí množin atributů --> <xsl:attribute-set name="section.title.level1.properties"> <xsl:attribute name="color">red</xsl:attribute> <xsl:attribute name="text-align">center</xsl:attribute> </xsl:attribute-set> </xsl:stylesheet>
DocBook umožňuje pomocí elementů pro metainformace
jako bookinfo
a dalších vložit do dokumentu bohaté
informace jako název, autor, vydavatel, datum vydání apod. Ne všechny
tyto informace se implicitně zobrazují na začátku generovaných
dokumentů. V XSL stylech je proto vzhled titulní stránky řízen
speciální šablonou, kterou lze samozřejmě předefinovat.
Výchozí vzhled titulních stran je definován v souboru
fo/titlepage.templates.xml
resp. html/titlepage.templates.xml
. Pokud chceme
změnit vzhled formátování titulní strany pro určitý element
x
musíme změnit šablonu
<t:titlepage
t:element="
. Vytvoříme si
nový soubor a šablonu v něm změníme. Na ukázce 6.11 – „Šablona pro změnu vzhledu titulní strany knihy – x
"...>ts-sablona.xml
“ jsme na titulní stranu přidali informaci
o vydavateli a držiteli copyrightu a změnili barvu titulku na
modrou.
Příklad 6.11. Šablona pro změnu vzhledu titulní strany knihy – ts-sablona.xml
<t:templates xmlns:t="http://nwalsh.com/docbook/xsl/template/1.0" xmlns:param="http://nwalsh.com/docbook/xsl/template/1.0/param" xmlns:fo="http://www.w3.org/1999/XSL/Format" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"> <t:titlepage t:element="book" t:wrapper="fo:block"> <t:titlepage-content t:side="recto"> <title t:named-template="division.title" param:node="ancestor-or-self::book[1]" text-align="center" color="blue" font-size="24pt" space-before="18pt" font-weight="bold" font-family="{$title.font.family}"/> <subtitle text-align="center" color="blue" font-size="20pt" space-before="16pt" font-family="{$title.font.family}"/> <corpauthor font-size="17pt" keep-with-next="always" space-before="2in"/> <authorgroup space-before="2in"/> <author font-size="17pt" space-before="10pt" keep-with-next="always"/> <publisher space-before="12cm" text-align="start" font-size="10pt" font-family="{$body.font.family}"/> <copyright text-align="start" color="red" font-size="8pt" font-family="{$body.font.family}"/> </t:titlepage-content> <t:titlepage-content t:side="verso"> </t:titlepage-content> <t:titlepage-separator> <fo:block break-after="page"/> </t:titlepage-separator> <t:titlepage-before t:side="recto"> </t:titlepage-before> <t:titlepage-before t:side="verso"> </t:titlepage-before> </t:titlepage> </t:templates>
Šablona je jen jakýsi prefabrikát, který musíme upravit pro
použití jako součást běžných XSL stylů. K tomu slouží styl
template/titlepage.xsl
, který z naší šablony
vygeneruje normální XSL styl. Vygenerování stylu provedeme
příkazem:
saxon -o ts-sablona.xsl ts-sablona.xml c:\docbook\xsl\template\titlepage.xsl
Vygenerovaný styl ts-sablona.xsl
pak
sloučíme se standardním stylem (viz ukázka 6.12 – „Sloučení nové titulní strany se standardním stylem – jinats.xsl
“), který použijeme pro generování výstupu.
Příklad 6.12. Sloučení nové titulní strany se standardním stylem – jinats.xsl
<?xml version="1.0" encoding="utf-8"?> <xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="1.0"> <xsl:import href="http://docbook.sourceforge.net/release/xsl/current/fo/docbook.xsl"/> <xsl:include href="ts-sablona.xsl"/> <xsl:param name="paper.type" select="'A4'"/> <xsl:param name="draft.watermark.image" select="''"/> </xsl:stylesheet>
Zcela obdobný mechanismus funguje i pro šablony titulních stran
při výstupu do HTML. Tyto šablony však slouží pouze k určení
elementů, které se mají dostat do výsledného HTML. Obvykle se u nich
nastavuje pouze atribut class
a pro definici vzhledu se pak používají kaskádové styly.