XSL-FO: XML pro sazbu dokumentů

XSL Formatting Objects popisují sazbu stránek. Typický postup převede obchodní XML pomocí XSLT do FO a samostatný procesor z něj vytvoří PDF.

Autor: Aktualizováno

Dvě oddělené fáze

XSLT vytváří strom FO; formatter řeší stránkování, fonty a výstup. XSL-FO není jazyk dotazů ani alternativní syntaxe CSS. Verze 1.1 pochází z roku 2006 a používá se zejména v zavedených dokumentových systémech.

Jedna stránka

Ulož celý dokument jako ukazka.fo. Simple-page-master určí papír a oblast textu, page-sequence použije tento master a flow naplní region-body.

Jedna stránka
<fo:root xmlns:fo="http://www.w3.org/1999/XSL/Format">
 <fo:layout-master-set>
  <fo:simple-page-master master-name="A4" page-width="210mm" page-height="297mm" margin="20mm"><fo:region-body/></fo:simple-page-master>
 </fo:layout-master-set>
 <fo:page-sequence master-reference="A4">
  <fo:flow flow-name="xsl-region-body"><fo:block font-size="14pt">Ahoj XML</fo:block></fo:flow>
 </fo:page-sequence>
</fo:root>

Jak vytvořit PDF

Apache FOP zpracuje FO, například příkazem fop -fo ukazka.fo -pdf ukazka.pdf. XML nástroj na tomto webu ověří syntaxi FO, ale PDF nevyrenderuje. Podporu jednotlivých vlastností ověř v dokumentaci konkrétního formatteru.

Časté problémy

Chybějící české znaky obvykle řeší font a jeho vložení do PDF. Přetečení tabulky řeš šířkami a zalamováním, ne změnou XML kódování. Výstup vizuálně zkontroluj i s dlouhými texty, prázdnými položkami a více stránkami.

XML → XSLT → FO → PDF: propojený příklad

zprava.xml — jednoduchá důvěryhodná data
<zprava><nadpis>Výsledek validace</nadpis><text>Dokument prošel kontrolou.</text></zprava>
zprava.xsl — celá XSLT 1.0 transformace
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns:fo="http://www.w3.org/1999/XSL/Format" version="1.0">
 <xsl:output method="xml" encoding="UTF-8"/>
 <xsl:template match="/zprava"><fo:root>
  <fo:layout-master-set><fo:simple-page-master master-name="a4" page-height="297mm" page-width="210mm" margin="20mm"><fo:region-body/></fo:simple-page-master></fo:layout-master-set>
  <fo:page-sequence master-reference="a4"><fo:flow flow-name="xsl-region-body">
   <fo:block font-size="16pt" space-after="8mm"><xsl:value-of select="nadpis"/></fo:block>
   <fo:block><xsl:value-of select="text"/></fo:block>
  </fo:flow></fo:page-sequence>
 </fo:root></xsl:template>
</xsl:stylesheet>
Dva procesory a dva samostatné výstupy
xsltproc zprava.xsl zprava.xml > zprava.fo
fop -fo zprava.fo -pdf zprava.pdf

První krok má vytvořit FO s nadpisem a textem; druhý stránku A4 s okrajem 20 mm. Master-name a master-reference musejí souhlasit, stejně jako flow-name a region. Otevři PDF a ověř české znaky; správné UTF-8 ve FO nezaručuje dostupnost fontu ve formatteru.

Pro tabulky a více stránek přidej fo:table, rozměry sloupců a pravidla přelomu. Hlavičky/patičky používají statický obsah a příslušné regions, nikoli připojení textu za poslední odstavec. Podporu konkrétní vlastnosti ověř v Apache FOP dokumentaci. XML validátor ověří syntax FO, ne to, zda se obsah vejde na stránku.

Jak poznat, ve kterém kroku je chyba

  1. Pokud xsltproc hlásí chybu, zkontroluj vstupní XML, šablonu a výrazy XPath.
  2. Pokud vznikne prázdné FO, ověř, zda template opravdu odpovídá kořeni dokumentu. Výchozí jmenný prostor vstupu může vyžadovat prefix ve výrazu.
  3. Pokud FOP odmítne FO, zkontroluj jeho strukturu, master-reference a podporované vlastnosti.
  4. Pokud PDF vznikne, ale text přetéká nebo chybí znaky, řeš sazbu a fonty. Správná XML syntaxe není potvrzení správného vzhledu.

Mezivýsledek zprava.fo si při ladění ponech. Oddělí chybu transformace od chyby sazby. Příkazy a hlášení formatteru dokumentuje Apache FOP.