V této části na jednoduchém příkladě podíváme na základy praktického použití XSLT a XSL-FO.
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 -ovýstup
dokument.xml
styl.xsl
xsltproc -ovýstup
styl.xsl
dokument.xml
msxsl -ovýstup
dokument.xml
styl.xsl
nxslt -ovýstup
dokument.xml
styl.xsl
xalan -ový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.
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
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.
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
).
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“.
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
Open-source FO procesor, rozšiřitelný o podporu českých fontů.
fop -fodokument.fo
-pdfdokument.pdf
FOP umí kromě PDF i další výstupní formáty – např. PCL nebo PostScript.
fop -fodokument.fo
-psdokument.ps
fop -fodokument.fo
-pcldokument.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
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í F5.
→ . Samotné formátování se spustí pomocí nebo stiskem klávesyDokument lze i vytisknout (
→ ) nebo převést do PDF ( → ).Od verze 3 je k dispozici i řádkové rozhraní.
ahfcmd -ddokument.fo
-odokument.pdf
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í F6. K dispozici je i řádkové rozhraní.
→ . Samotné formátování se spustí pomocí nebo stiskem klávesyxml2pdf -fodokument.fo
-pdfdokument.pdf
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.
fo2docxdokument.fo
dokument.docx
fo2rtfdokument.fo
dokument.rtf
fo2odtdokument.fo
dokument.odt
fo2wmldokument.fo
dokument.wml
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.
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>— </xsl:text> <xsl:apply-templates/> <xsl:text> — </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
dokument.pdf
xep-xml
dokument.xml
-xsl
styl.xsl
dokument.pdf
ahfcmd-d
dokument.xml
-s
styl.xsl
-o
dokument.pdf
xml2pdf-xslt
dokument.xml
styl.xsl
dokument.pdf
ibex-xml
dokument.xml
-xsl
styl.xsl
dokument.pdf