Potřebujete pomoci s XSLT?
Nabízím školení, konzultace, vývoj XSLT kódu 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.

1.6 XSL-FO

Jak jsme si již řekli, formátovací objekty jsou speciální sada značek určená pro popis vzhledu tištěných dokumentů. Tuto technologii můžeme využít při generování tištěných výstupů (např. PDF) z dokumentů XML. Proces generování PDF je dvoustupňový – v prvním kroku se pomocí XSLT přetransformuje XML dokument na formátovací objekty a ty se v druhém kroku pomocí procesoru FO převedou na naformátovaný výstup.

Příklad 1.5. Styl generující formátovací objekty – 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:template match="/">
    <fo:root>
      <!-- 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="15mm"/>        
          <!-- Oblast pro patu stránky -->
          <fo:region-after extent="10mm"/>
        </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="Helvetica">
      <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>

Vidíme, že samotný styl je podobný stylům pro generování HTML, akorát místo HTML generujeme elementy jednotlivých formátovacích objektů.

Pro vygenerování PDF použijeme sekvenci příkazů:

saxon -o clanek.fo clanek.xml clanek.xsl
xep -fo clanek.fo

XEP umí transformaci provést i vnitřně a vzniklé formátovací objekty rovnou naformátovat:

xep -xml clanek.xml -xsl clanek.xsl
© Jiří Kosek 2014

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


Copyright © 2000-2014 Jiří Kosek