Potřebujete pomoci s XSL-FO?
Nabízím školení, konzultace, vývoj tiskových šablon 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.

Kapitola 2. Základní principy

2.1. Spuštění XSLT transformace
2.2. Použití XSLT pro generování HTML
2.3. Základní struktura souboru FO
2.4. Procesory FO
2.4.1. XEP
2.4.2. FOP
2.4.3. XSL Formatter
2.4.4. Xml2PDF
2.4.5. Ibex PDF Creator
2.4.6. XFC
2.4.7. Spouštění formátování
2.5. Zpracování XML, XSLT a FO

V této části na jednoduchém příkladě podíváme na základy praktického použití XSLT a XSL-FO.

2.1 Spuštění XSLT transformace

Jak již bylo řečeno pro spuštění transformace potřebujeme XSLT procesor. Existuje jich několik a spuštění těch nejpoužívanějších shrnuje následující přehled.

saxon -o výstup dokument.xml styl.xsl
xsltproc -o výstup styl.xsl dokument.xml
msxsl -o výstup dokument.xml styl.xsl
nxslt -o výstup dokument.xml styl.xsl
xalan  -o výstup dokument.xml styl.xsl

Pro všechny procesory platí, že jim je potřeba předat tři parametry – vstupní dokument XML, XSLT styl popisující transformaci a jméno souboru, kam se má uložit výsledek transformace.

2.2 Použití XSLT pro generování HTML

Ještě než se pustíme do výkladu formátovacích objektů ukážeme si, jak se využívá XSLT pro generování výstupu do HTML. Uvidíme tak, že XSLT umožňuje velmi snadno generovat z jednoho dokumentu XML několik výstupních formátů.

Předpokládejme, že máme v XML uloženy jednoduché články podobné tomu z příkladu 2.3 – „Ukázkový soubor XML – clanek.xml. Pro převod těchto dokumentů do HTML stačí napsat jednoduchý styl, který jednotlivé elementy namapuje na požadované elementy HTML.

Příklad 2.1. XSLT styl pro převod do HTML – clanekhtml.xsl

<?xml version="1.0" encoding="utf-8"?>
<xsl:stylesheet version="1.0"
                xmlns:xsl="http://www.w3.org/1999/XSL/Transform">

  <!-- Výstup bude do HTML v kódování ISO Latin 2 -->
  <xsl:output indent="yes" method="html" encoding="iso-8859-2"/> 

  <!-- Zpracování celého dokumentu, kořenový element vygeneruje
       kostru HTML dokumentu -->
  <xsl:template match="/">
    <html>
      <head>
        <title><xsl:value-of select="/clanek/zahlavi/autor"/>: 
               <xsl:value-of select="/clanek/zahlavi/nazev"/></title>
        <style type="text/css">
          .zahlavi { text-align: center;
                     border: solid 2px red;
                     background-color: #F0E0E0; 
                     padding: 1em; }
          .rubrika { font-size: xx-small;
                     float: right; }
        </style>
      </head>
      <body>
        <xsl:apply-templates/>
      </body>
    </html>
  </xsl:template>

  <xsl:template match="zahlavi">
    <div class="zahlavi">
      <xsl:apply-templates/>
    </div>
  </xsl:template>
  
  <xsl:template match="rubrika">
    <p class="rubrika">
      Rubrika: <b><xsl:apply-templates/></b>
    </p>
  </xsl:template>

  <xsl:template match="nazev">
    <h1 align="center"><xsl:apply-templates/></h1>
  </xsl:template>

  <xsl:template match="autor">
    <p align="center"><i><xsl:apply-templates/></i></p>
  </xsl:template>

  <xsl:template match="perex">
    <p><i><xsl:apply-templates/></i></p>
  </xsl:template>

  <xsl:template match="para">
    <p><xsl:apply-templates/></p>
  </xsl:template>

  <xsl:template match="em">
    <i><xsl:apply-templates/></i>
  </xsl:template>

</xsl:stylesheet>

Převod článku do HTML pak zajistíme příkazem:

saxon -o clanek.html clanek.xml clanekhtml.xsl

2.3 Základní struktura souboru FO

Obdobné postupy jako při konverzi do HTML se používají i pro tištěný výstup s pomocí formátovacích objektů. Nejprve se však stručně seznámíme se sémantikou formátovacích objektů, protože není zdaleka tak známá jako sémantika HTML.

Všechny formátovací objekty se zapisují jako elementy, které patří do jmenného prostoru http://www.w3.org/1999/XSL/Format. Dále v textu budeme předpokládat, že pro tento jmenný prostor máme deklarován prefix fo.

Každý soubor FO je XML dokument s kořenovým elementem fo:root, který na svém začátku nejdříve definuje předlohy stran (fo:layout-master-set) – můžeme definovat rozměry stránky, velikost jejích okrajů apod. Těchto definic může být více a můžeme je sdružovat do předloh sekvencí stránek – tím lze snadno dosáhnout takových efektů, jako odlišný vzhled první stránky dokumentu či kapitoly nebo odlišnou velikost okrajů a záhlaví na sudých a lichých stránkách.

V jednoduchých dokumentech většinou používáme jen jednu geometrii stránky, a proto je v definici předloh stran definována jen jedna předloha stránky pomocí fo:simple-page-master. Důležité je tuto předlohu pojmenovat pomocí atributu master-name.

Za definicí předloh stránek pak následují sekvence stránek (fo:page-sequence). Pro každou sekvenci stránek musíme pomocí atributu master-reference určit, do jaké předlohy sekvence stránek se má sázet její obsah, jde definovat obsah pro záhlaví, zápatí, levý a pravý okraj. Ve formátovacím objektu fo:flow jsou pak obsaženy běžné objekty jako právě fo:block, které již generují samotný obsah stránek.

Pro určité druhy objektů, které se mají ve výstupu objevit, nám již použití samotného fo:block nestačí. Pro tyto případy jsou k dispozici účelově zaměřené objekty, které si popíšeme dále.

Příklad 2.2. Ukázkový soubor FO – clanekfo.fo

<?xml version="1.0" encoding="utf-8"?>
<fo:root xmlns:fo="http://www.w3.org/1999/XSL/Format"
  font-family="Times New Roman, serif" font-size="11pt" language="cs"
  hyphenate="true">
  <fo:layout-master-set>
    <fo:simple-page-master master-name="my-page" page-height="297mm"
      page-width="210mm" margin="1in">
      <fo:region-body margin-bottom="10mm"/>
      <fo:region-after extent="5mm"/>
    </fo:simple-page-master>
  </fo:layout-master-set>
  <fo:page-sequence master-reference="my-page">
    <fo:static-content flow-name="xsl-region-after">
      <fo:block>Strana <fo:page-number/></fo:block>
    </fo:static-content>
    <fo:flow flow-name="xsl-region-body">
      <fo:block text-align="center" space-before="20pt" space-after="14pt"
        font-family="Arial, sans-serif" hyphenate="false">
        <fo:block font-size="6pt" text-align="end">Rubrika: <fo:inline
            font-weight="bold">Aktuality</fo:inline></fo:block>
        <fo:block font-size="24pt" font-weight="bold" space-before="6pt"
          space-after="4pt">EU chce použít XML při rozvoji
        e-businessu</fo:block>
      </fo:block>
      <fo:block text-align="justify" font-style="italic" font-weight="bold"
        >Evropská komise si nechala vypracovat zprávu, která se zabývá možnostmi
        rozvoje elektronického obchodování zejména pro malé a střední
        podnikatele. Výsledky studie možná někoho překvapí – e-business se bude
        rozvíjet díky použití XML a lepších vyhledávacích technologií.</fo:block>
      <fo:block text-indent="20pt" text-align="justify">Studii pro Evropskou
        komisi vypracovala společnost InfoConsult, která sdružuje několik
        předních evropských konzultantů, kteří se nezaměřují jen na podnikání,
        ale i na informační a komunikační technologie. Podle nich je dnes
        největší překážkou pro uplatnění e-businessu <fo:inline
          font-style="italic">obtížné vyhledávání informací</fo:inline>. Pokud
        hledáme na Internetu určitý výrobek, službu či firmu, musíme použít
        klasické vyhledávací služby, které nás zahltí stovkami, mnohdy
        neužitečných, odkazů.</fo:block>
      <fo:block text-indent="20pt" text-align="justify">Studie navrhuje
        vytvoření sady XML tagů, kterými by se na webových stránkách označovaly
        jednotlivé údaje o firmě, jejích výrobcích a službách. Současně by se
        měla vytvořit nová vyhledávací služba, která by „rozuměla“ nově
        definovaným tagům. Pomocí této služby by pak každý mohl velice snadno
        nalézt informace nebo výrobek, který potřebuje.</fo:block>
      <fo:block text-indent="20pt" text-align="justify">Jistě krásná idea však
        vyvolává mnoho praktických otázek a problémů. První překážkou je zatím
        slabá podpora XML v běžně používaných prohlížečích. Doplnění speciálních
        tagů do současných webových stránek by nemuselo dělat dobře některým
        starším prohlížečům. Aby byl celý systém opravdu užitečný, musela by
        speciální tagy na svých stránkách používat většina firem. Jazyk XML
        zatím však autoři webových stránek neovládají a dosud není na trhu
        cenově dostupný WYSIWYG editor pro XML.</fo:block>
      <fo:block font-style="italic" text-align="end" space-before="6pt">— Jiří
        Kosek — </fo:block>
    </fo:flow>
  </fo:page-sequence>
</fo:root>

Každá stránka se skládá z několika oblastí (viz obrázek 2.1 – „Regiony na stránce“). Při definici předlohy stránky můžeme pro jednotlivé regiony určit jejich rozměry a formátování. Nejdůležitější regiony jsou xsl-region-body (samotné tiskové zrcadlo), xsl-region-before (záhlaví) a xsl-region-after (zápatí).

Chceme-li použít regiony pro záhlaví/zápatí, musíme pro ně vyhradit místo tím, že definujeme příslušný okraj na xsl-region-body a pomocí vlastnosti extent pak řekneme, kolik z tohoto prostoru mohou zabrat.

Obrázek 2.1. Regiony na stránce

Regiony na stránce

V sekvenci stránek (fo:page-sequence) pak musíme určit do jakého regionu se bude formátovat statický obsah (fo:static-content) a do jakého samotný text dokument (fo:flow).

2.4 Procesory FO

Pro vygenerování výstupu z FO musíme použít nějaký procesor FO. Existuje jich několik, liší se úrovní podpory FO a licencováním. Informace o instalaci a přidání podpory češtiny do procesorů naleznete v kapitole 7 – „Instalace.

2.4.1 XEP

Komerční FO procesor, který nabízí jednu z nejúplnějších implementací FO. K dispozici je zdarma osobní verze, kterou lze použít pro nekomerční účely. Osobní verze na konec každé stránky přidá malý reklamní text. Funguje čeština i české dělení slov.

xep -fo dokument.fo

2.4.2 FOP

Open-source FO procesor, rozšiřitelný o podporu českých fontů.

fop -fo dokument.fo -pdf dokument.pdf

FOP umí kromě PDF i další výstupní formáty – např. PCL nebo PostScript.

fop -fo dokument.fo -ps dokument.ps
fop -fo dokument.fo -pcl dokument.pcl

Výstup do těchto formátů ale nefunguje vždy spolehlivě, zvláště při použití českých fontů.

FOP umí zobrazit zformátovaný dokument i přímo na obrazovce:

fop -fo dokument.fo -awt

2.4.3 XSL Formatter

Komerční FO procesor, který nabízí jednu z nejúplnějších implementací FO. Standardně zobrazuje náhled formátovaného dokumentu přímo na obrazovce. Soubor ke zpracování se vybírá pomocí FileOpen. Samotné formátování se spustí pomocí Run formatter nebo stiskem klávesy F5.

Dokument lze i vytisknout (FilePrint) nebo převést do PDF (FilePDF Output).

Od verze 3 je k dispozici i řádkové rozhraní.

ahfcmd -d dokument.fo -o dokument.pdf

2.4.4 Xml2PDF

Xml2PDF je procesor FO napsaný čistě v .NETu. Standardně zobrazuje náhled formátovaného dokumentu přímo na obrazovce. Soubor ke zpracování se vybírá pomocí FileOpen Document. Samotné formátování se spustí pomocí Format nebo stiskem klávesy F6. K dispozici je i řádkové rozhraní.

xml2pdf -fo dokument.fo -pdf dokument.pdf

2.4.5 Ibex PDF Creator

Další komerční FO procesor.

ibex -xml dokument.fo -pdf dokument.pdf

2.4.6 XFC

XMLMind XSL-FO Converter se od většiny ostatních formátovačů liší formáty, která je schopný generovat. Umí totiž generovat formáty ODT, OOXML, RTF a WordML (XML formát Wordu 2003). Nabízí API i jednoduchou utilitu pro spouštění převodu. Konverzi je možné spouštět i z příkazové řádky.

fo2docx dokument.fo dokument.docx
fo2rtf dokument.fo dokument.rtf
fo2odt dokument.fo dokument.odt
fo2wml dokument.fo dokument.wml

2.4.7 Spouštění formátování

Obecně nabízejí formátovače FO grafické a řádkové rozhraní. Kromě toho většinou obsahují i API, které umožňuje formátování spouštět přímo z našich aplikací. Nejčastěji bývají k dispozici API pro Javu, .NET a COM. Často bývá formátovací engine nainstalován na webový server a dokumenty pak formátuje podle potřeby.

Většinu editorů XML lze rovněž nastavit tak, aby přímo volaly určitý procesor FO.

2.5 Zpracování XML, XSLT a FO

Psát FO soubor ručně asi nikdo nebude, většinou se generuje automaticky. Nejčastěji se postupuje tak, že si pro XML dokument vytvoříme XSLT styl, který bude sloužit pro transformaci do FO. Nic nám ale nebrání FO generovat jakýmkoliv jiným způsobem, například přímo z nějaké aplikace.

Příklad 2.3. Ukázkový soubor XML – clanek.xml

<?xml version="1.0" encoding="utf-8"?>
<clanek>
  <zahlavi>
    <rubrika>Aktuality</rubrika>
    <nazev>EU chce použít XML při rozvoji e-businessu</nazev>
    <autor>Jiří Kosek</autor>
  </zahlavi>
  <perex>Evropská komise si nechala vypracovat zprávu, která se zabývá
možnostmi rozvoje elektronického obchodování zejména pro malé a
střední podnikatele. Výsledky studie možná někoho překvapí –
e-business se bude rozvíjet díky použití XML a lepších vyhledávacích
technologií.</perex>
  <para>Studii pro Evropskou komisi vypracovala společnost
InfoConsult, která sdružuje několik předních evropských konzultantů,
kteří se nezaměřují jen na podnikání, ale i na informační a
komunikační technologie. Podle nich je dnes největší překážkou pro
uplatnění e-businessu <em>obtížné vyhledávání informací</em>. Pokud
hledáme na Internetu určitý výrobek, službu či firmu, musíme použít
klasické vyhledávací služby, které nás zahltí stovkami, mnohdy
neužitečných, odkazů.</para>
  <para>Studie navrhuje vytvoření sady XML tagů, kterými by se na
webových stránkách označovaly jednotlivé údaje o firmě, jejích
výrobcích a službách. Současně by se měla vytvořit nová vyhledávací
služba, která by „rozuměla“ nově definovaným tagům. Pomocí této služby
by pak každý mohl velice snadno nalézt informace nebo výrobek, který
potřebuje.</para>
  <para>Jistě krásná idea však vyvolává mnoho praktických otázek a
problémů. První překážkou je zatím slabá podpora XML v běžně
používaných prohlížečích. Doplnění speciálních tagů do současných
webových stránek by nemuselo dělat dobře některým starším prohlížečům.
Aby byl celý systém opravdu užitečný, musela by speciální tagy na
svých stránkách používat většina firem. Jazyk XML zatím však autoři
webových stránek neovládají a dosud není na trhu cenově dostupný
WYSIWYG editor pro XML.</para>
</clanek>

Pro XML dokument pak musíme vytvořit XSLT styl, kde jednotlivé šablony převedou elementy XML na formátovací objekty. Protože každý soubor FO musí obsahovat určité povinné části jako definici předloh stránek, generuje obvykle šablona pro kořenový uzel tuto kostru FO podobně jako se při konverzi do HTML generuje kostra HTML stránky. Nesmíme rovněž zapomenout na deklaraci jmenného prostoru FO.

Příklad 2.4. Ukázkový styl pro převod do FO – clanek.xsl

<?xml version="1.0" encoding="utf-8"?>
<xsl:stylesheet version="1.0"
                xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
                xmlns:fo="http://www.w3.org/1999/XSL/Format">

<xsl:output method="xml" encoding="utf-8"/>

<xsl:template match="/">
  <fo:root font-family="Times New Roman, serif" font-size="11pt" language="cs" hyphenate="true">
    <!-- Definice layoutu stránky -->
    <fo:layout-master-set>
      <!-- Rozměry stránky a její okraje -->
      <fo:simple-page-master master-name="my-page"
                             page-height="297mm" 
                             page-width="210mm" 
                             margin="1in">
        <!-- Tiskové zrcadlo - oblast pro samotný obsah stránky -->
        <fo:region-body margin-bottom="10mm"/>        
        <!-- Oblast pro patu stránky -->
        <fo:region-after extent="5mm"/>
      </fo:simple-page-master>
    </fo:layout-master-set>
    
    <!-- Definice obsahu stránky -->
    <fo:page-sequence master-reference="my-page">
      <!-- Společný obsah všech stránek v patě stránky -->
      <fo:static-content flow-name="xsl-region-after">
        <fo:block>
          <xsl:text>Strana </xsl:text>
          <fo:page-number/>
        </fo:block>
      </fo:static-content>
      <!-- Samotný text dokumentu -->
      <fo:flow flow-name="xsl-region-body">
        <!-- Zpracování všech elementů zdrojového dokumentu -->
        <xsl:apply-templates/>
        <xsl:apply-templates select="clanek/zahlavi/autor"/>
      </fo:flow>
    </fo:page-sequence>
  </fo:root>
</xsl:template>

<!-- Šablona pro záhlaví článku -->
<xsl:template match="zahlavi">
  <fo:block text-align="center" space-before="20pt"
            space-after="14pt" font-family="Arial, sans-serif"
            hyphenate="false">
    <xsl:apply-templates select="rubrika"/>
    <xsl:apply-templates select="nazev"/>
  </fo:block>
</xsl:template>

<!--Šablona pro rubriku -->
<xsl:template match="rubrika">
  <fo:block font-size="6pt" text-align="end">
    <xsl:text>Rubrika: </xsl:text>
    <fo:inline font-weight="bold">
      <xsl:apply-templates/>
    </fo:inline>
  </fo:block>
</xsl:template>

<!--Šablona pro název článku -->
<xsl:template match="nazev">
  <fo:block font-size="24pt" font-weight="bold" space-before="6pt"
            space-after="4pt">
    <xsl:apply-templates/>
  </fo:block>
</xsl:template>

<!--Šablona pro autora článku -->
<xsl:template match="autor">
  <fo:block font-style="italic" text-align="end" space-before="6pt">
    <xsl:text>&#x2014; </xsl:text>
    <xsl:apply-templates/>
    <xsl:text> &#x2014; </xsl:text>
  </fo:block>
</xsl:template>

<!--Šablona pro perex -->
<xsl:template match="perex">
  <fo:block text-align="justify" font-style="italic" font-weight="bold">
    <xsl:apply-templates/>
  </fo:block>
</xsl:template>

<!--Šablona pro odtavec -->
<xsl:template match="para">
  <fo:block text-indent="20pt" text-align="justify">
    <xsl:apply-templates/>
  </fo:block>
</xsl:template>

<!--Šablona pro zvýraznění -->
<xsl:template match="em">
  <fo:inline font-style="italic">
    <xsl:apply-templates/>
  </fo:inline>
</xsl:template>

</xsl:stylesheet>

Když máme XML dokument i styl, můžeme snadno získat soubor s FO pomocí libovolného XSLT procesoru. Např.:

saxon -o dokument.fo dokument.xml styl.xsl
xsltproc -o dokument.fo styl.xsl dokument.xml
msxsl -o dokument.fo dokument.xml styl.xsl

Získaný soubor pak zpracujeme procesorem FO jak je popsáno výše.

Některé procesory FO umějí provádět i XSLT transformaci.

fop -xml dokument.xml -xsl styl.xsl -pdf dokument.pdf
xep -xml dokument.xml -xsl styl.xsl -pdf dokument.pdf
ahfcmd -d dokument.xml -s styl.xsl -o dokument.pdf
xml2pdf -xslt dokument.xml styl.xsl -pdf dokument.pdf
ibex -xml dokument.xml -xsl styl.xsl -pdf dokument.pdf
© Jiří Kosek 2014

Tento dokument je určen výhradně pro osobní potřebu seznámení se s technologií XSL-FO. 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.

Dokument je zkrácenou verzí školicích materiálů používaných během školení XSL-FO.


Copyright © 2002-2015 Jiří Kosek