Kapitola 6. Úprava XSL stylů

Obsah

6.1. Úprava chování stylu pomocí parametrů
6.1.1. Běžné úpravy pro tisk
6.1.2. Běžné úpravy pro generování HTML
6.1.3. Úpravy pro generování HTML Helpu
6.2. Předefinování pravidel pro zpracování elementů
6.3. Úpravy automaticky generovaných textů
6.4. Úprava vzhledu generovaných HTML stránek pomocí CSS
6.5. Úprava vzhledu tištěného výstupu pomocí vlastností FO
6.6. Změna vzhledu titulní strany

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].

6.1. Úprava chování stylu pomocí parametrů

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

6.1.1. Běžné úpravy pro tisk

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>

6.1.2. Běžné úpravy pro generování HTML

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>

6.1.3. Úpravy pro generování HTML Helpu

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).

6.2. Předefinování pravidel pro zpracování elementů

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>

6.3. Úpravy automaticky generovaných textů

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.

6.4. Úprava vzhledu generovaných HTML stránek pomocí CSS

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>

6.5. Úprava vzhledu tištěného výstupu pomocí vlastností FO

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>

6.6. Změna vzhledu titulní strany

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="x"...>. 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 – 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.

© Jiří Kosek 2007
Tento dokument je určen výhradně pro osobní potřebu seznámení se systémem DocBook. Jakékoliv jiné použití, včetně dalšího šíření, pořizování kopií apod. je výslovně zakázáno a bude považováno za porušení autorských práv.