Article Index

Základ XSL:FO

Transformace jsou schopny vypisovat data z xml formátu do jiného. Například výpis evidence v XML formátu do HTML. Pokud je potřeba výstup formátovat, například pro tištěné materiály, musíme použít XSL:FO - formating object. XSL:FO vytvářejí stránkovaný výstup - vše se musí přizpůsobit oblasti, která je na daném rozměru určena pro obsah.

Příklad může být formát bakalářské práce - papír má mít formát A4 - tedy 297mm x 210mm, okraje jsou pak nahoře 30mm, dole 25mm, vlevo 35mm a vpravo 20mm. Plus musíme počítat s místem na záhlaví a zápatí - minimálně pro číslování stran. Pro obsah je tedy maximální plocha 242mm x 165mm.

Stejně jako u XSLT jsou základním stavebním kamenem šablony. Vzhledem k tomu, že u FO nedochází k manipulaci s elementy, ale s formátováním, jedná se o tyto složky:

  • page - stránka
  • region - dílčí části stránky
  • block - části obsahu (odstavec)
  • line - řádek
  • inline - část řádku

Hlavní složkou FO je deklarace stránky - její rozměry a okraje. Stanovují se základní rozměry pro další formátování. Stránka se dělí na jednotlivé složky - regiony:

  • region-body
  • region-before
  • region-after
  • region-start
  • region-end

Plus jednotlivé okraje.

Jednoduchý dokument

<?xml version="1.0" encoding="UTF-8"?>
<fo:root xmlns:fo="http://www.w3.org/1999/XSL/Format">
  <fo:layout-master-set><!-- Zde definujeme vlastnosti stránky - od těchto rozměrů se bude odvíjet velikost a vzhled dokumentu -->
     <fo:simple-page-master master-name="A4"
                            page-height="297mm"
                            page-width="210mm"
                            margin="10mm"
>
      
     </fo:simple-page-master>
   </fo:layout-master-set>
   <fo:page-sequence master-reference="A4"> <!-- Posloupnost stránek, můžeme například definovat zvlášť liché a sudé stránky -->
     <fo:flow flow-name="xsl-region-body">
      <fo:block>Budoucí text na stránce</fo:block>
    </fo:flow>
    <fo:static-content flow-name="xsl-region-after"> <!-- Statický obsah je na každé straně stejný - zde vkládáme číslo stránky do prostoru pod obsah. -->
      <fo:block>
        <xsl:text>Strana </xsl:text> <fo:page-number/>
      </fo:block>
    </fo:static-content>

   </fo:page-sequence>
</fo:root>

Základní osnova dokumentu je hotová, máme připravenou stránku A4, jenom musíme doplnit obsah - tedy text pro zadání práce. Pomocí XSLT vybereme požadované texty a vložíme je na své místo v dokumentu pomocí dalších XSL:FO elementů.

Obsahová stránka

Seznam

<fo:list-block>
  <fo:list-item><!-- jednotlivá položka seznamu -->
    <fo:list-item-label>
      <fo:block>-</fo:block> <!-- uvození položky seznamu -->
    </fo:list-item-label>
    <fo:list-item-body><!-- položka seznamu - její text -->
      <fo:block>Spitfire I</fo:block> <!-- blok s textem položky -->
    </fo:list-item-body>
   </fo:list-item>
  <fo:list-item>
    <fo:list-item-label>
      <fo:block>-</fo:block>
    </fo:list-item-label>
    <fo:list-item-body>
      <fo:block>Spitfire II</fo:block>
    </fo:list-item-body>
   </fo:list-item>
</fo:list-block>

 Tabulka

<fo:table-and-caption> <!-- základní značka uvozující tabulku -->
   <fo:table><!-- tabulka -->
     <fo:table-column column-width="25mm"/><!-- minimální šířka prvního sloupce -->
     <fo:table-column column-width="25mm"/><!-- minimální šířka druhého sloupce -->
   <fo:table-header><!-- úvodní řádek tabulky - hlavička (popisky sloupců) -->
      <fo:table-row><!-- řádek tabulky -->
         <fo:table-cell><!-- buňka tabulky -->
           <fo:block font-weight="bold">Výrobce</fo:block><!-- blok s textem -->
         </fo:table-cell>
         <fo:table-cell>
           <fo:block font-weight="bold">Model</fo:block>
         </fo:table-cell>
      </fo:table-row>
   </fo:table-header>
  <fo:table-body><!-- tělo tabulky s hodnotami -->
    <fo:table-row>
      <fo:table-cell>
        <fo:block>Revell</fo:block>
      </fo:table-cell>
      <fo:table-cell>
        <fo:block>Spitfire Mk. I</fo:block>
      </fo:table-cell>
    </fo:table-row>
    <fo:table-row>
      <fo:table-cell>
        <fo:block>Airfix</fo:block>
      </fo:table-cell>
      <fo:table-cell>
        <fo:block>JAS-39C Gripen</fo:block>
      </fo:table-cell>
    </fo:table-row>
   </fo:table-body>
  </fo:table>
</fo:table-and-caption>