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 5. Formátovací model

5.1. Skládání bloků
5.2. Výběr předlohy stránek

Formátovací model XSL-FO je poměrně složitý, protože počítá se sazbou vícejazyčných dokumentů v různých směrech. Pro sazbu dokumentů v evropských jazycích nás většina těchto složitostí nemusí zajímat.

5.1 Skládání bloků

Jak již víme, XSL-FO obsahuje dva základní druhy bloků – blokové a inline. Inline se skládají za sebe do řádky, a případně se zalamují na šířku stránky. Blokové elementy se pak skládají pod sebe. Každý blok může mít nastaven vnější okraj (margin), rámeček (border) a vnitřní okraj (padding).

5.2 Výběr předlohy stránek

Při formátování sekvence stránek se postupně berou jednotlivé formátovací objekty a vkládají se do předlohy stránky. Předloha stránky je určena pomocí vlastnosti master-reference. V nejtriviálnějších případech je předloha stránky jen jedna, a formátování je jednoduché.

Chceme-li však dosáhnout složitějších efektů, například odlišné sudé a liché stránky, jinak formátovanou první stránku apod., musíme použít složitější předlohy stránek. Slouží k tomu element fo:page-sequence-master. Uvnitř něj se mohou v libovolném pořadí a počtu vyskytovat elementy fo:single-page-master-reference, fo:repeatable-page-master-reference a fo:repeatable-page-master-alternatives).

Element fo:simple-page-master-reference říká, že pro danou sekvenci stránek se jedna stránka má naformátovat do dané předlohy. Můžeme tak přesně určit, jak se budou předlohy stránek volit a využít to třeba pro odlišná záhlaví.

Příklad 5.1. Různá záhlaví pro různé stránky – ruzna-zahlavi1.fo

<?xml version="1.0" encoding="utf-8"?>
<fo:root xmlns:fo="http://www.w3.org/1999/XSL/Format">
  <fo:layout-master-set>
    <fo:simple-page-master master-name="page1" margin="1in">
      <fo:region-body margin-top="15mm"/>
      <fo:region-before extent="10mm" region-name="page1header" />
    </fo:simple-page-master>
    <fo:simple-page-master master-name="page2" margin="1in">
      <fo:region-body margin-top="15mm"/>
      <fo:region-before extent="10mm" region-name="page2header" />
    </fo:simple-page-master>
    <fo:simple-page-master master-name="page3" margin="1in">
      <fo:region-body margin-top="15mm"/>
      <fo:region-before extent="10mm" region-name="page3header" />
    </fo:simple-page-master>
    <fo:page-sequence-master master-name="my-sequence-master">
      <fo:single-page-master-reference master-reference="page1"/>
      <fo:single-page-master-reference master-reference="page2"/>
      <fo:single-page-master-reference master-reference="page3"/>
    </fo:page-sequence-master>    
  </fo:layout-master-set>
  <fo:page-sequence master-reference="my-sequence-master">
    <fo:static-content flow-name="page1header">
      <fo:block>Kód: 65001</fo:block>
    </fo:static-content>
    <fo:static-content flow-name="page2header">
      <fo:block>Kód: 64002</fo:block>
    </fo:static-content>
    <fo:static-content flow-name="page3header">
      <fo:block>Kód: 64003</fo:block>
    </fo:static-content>
    <fo:flow flow-name="xsl-region-body">
      <fo:block font-size="36pt">XXXXXX</fo:block>
      <fo:block font-size="36pt">XXXXXX</fo:block>
      <fo:block font-size="36pt">XXXXXX</fo:block>
      <fo:block font-size="36pt">XXXXXX</fo:block>
      <fo:block font-size="36pt">XXXXXX</fo:block>
      <fo:block font-size="36pt">XXXXXX</fo:block>
      <fo:block font-size="36pt">XXXXXX</fo:block>
      <fo:block font-size="36pt">XXXXXX</fo:block>
      <fo:block font-size="36pt">XXXXXX</fo:block>
      <fo:block font-size="36pt">XXXXXX</fo:block>
      <fo:block font-size="36pt">XXXXXX</fo:block>
      <fo:block font-size="36pt">XXXXXX</fo:block>
      <fo:block font-size="36pt">XXXXXX</fo:block>
      <fo:block font-size="36pt">XXXXXX</fo:block>
      <fo:block font-size="36pt">XXXXXX</fo:block>
      <fo:block font-size="36pt">XXXXXX</fo:block>
      <fo:block font-size="36pt">XXXXXX</fo:block>
      <fo:block font-size="36pt">XXXXXX</fo:block>
      <fo:block font-size="36pt">XXXXXX</fo:block>
      <fo:block font-size="36pt">XXXXXX</fo:block>
      <fo:block font-size="36pt">XXXXXX</fo:block>
      <fo:block font-size="36pt">XXXXXX</fo:block>
      <fo:block font-size="36pt">XXXXXX</fo:block>
      <fo:block font-size="36pt">XXXXXX</fo:block>
      <fo:block font-size="36pt">XXXXXX</fo:block>
      <fo:block font-size="36pt">XXXXXX</fo:block>
      <fo:block font-size="36pt">XXXXXX</fo:block>
      <fo:block font-size="36pt">XXXXXX</fo:block>
      <fo:block font-size="36pt">XXXXXX</fo:block>
      <fo:block font-size="36pt">XXXXXX</fo:block>
      <fo:block font-size="36pt">XXXXXX</fo:block>
      <fo:block font-size="36pt">XXXXXX</fo:block>
      <fo:block font-size="36pt">XXXXXX</fo:block>
      <fo:block font-size="36pt">XXXXXX</fo:block>
    </fo:flow>
  </fo:page-sequence>
</fo:root>

Element fo:repeatable-page-master-reference říká, že pro danou sekvenci stránek se zadaný počet stránek má naformátovat do dané předlohy.

Příklad 5.2. Různá záhlaví pro různé stránky – ruzna-zahlavi2.fo

<?xml version="1.0" encoding="utf-8"?>
<fo:root xmlns:fo="http://www.w3.org/1999/XSL/Format">
  <fo:layout-master-set>
    <fo:simple-page-master master-name="nasirku" margin="1in"
                           page-width="297mm" page-height="210mm">
      <fo:region-body/>      
    </fo:simple-page-master>
    <fo:simple-page-master master-name="navysku" margin="1in"
                           page-width="210mm" page-height="297mm">
      <fo:region-body/>      
    </fo:simple-page-master>
    <!-- První dvě stránky budou na šířku -->
    <fo:page-sequence-master master-name="my-sequence-master">
      <fo:repeatable-page-master-reference master-reference="nasirku" maximum-repeats="2"/>
      <fo:repeatable-page-master-reference master-reference="navysku" maximum-repeats="1000"/>
    </fo:page-sequence-master>    
  </fo:layout-master-set>
  <fo:page-sequence master-reference="my-sequence-master">
    <fo:flow flow-name="xsl-region-body">
      <fo:block font-size="36pt">XXXXXX</fo:block>
      <fo:block font-size="36pt">XXXXXX</fo:block>
      <fo:block font-size="36pt">XXXXXX</fo:block>
      <fo:block font-size="36pt">XXXXXX</fo:block>
      <fo:block font-size="36pt">XXXXXX</fo:block>
      <fo:block font-size="36pt">XXXXXX</fo:block>
      <fo:block font-size="36pt">XXXXXX</fo:block>
      <fo:block font-size="36pt">XXXXXX</fo:block>
      <fo:block font-size="36pt">XXXXXX</fo:block>
      <fo:block font-size="36pt">XXXXXX</fo:block>
      <fo:block font-size="36pt">XXXXXX</fo:block>
      <fo:block font-size="36pt">XXXXXX</fo:block>
      <fo:block font-size="36pt">XXXXXX</fo:block>
      <fo:block font-size="36pt">XXXXXX</fo:block>
      <fo:block font-size="36pt">XXXXXX</fo:block>
      <fo:block font-size="36pt">XXXXXX</fo:block>
      <fo:block font-size="36pt">XXXXXX</fo:block>
      <fo:block font-size="36pt">XXXXXX</fo:block>
      <fo:block font-size="36pt">XXXXXX</fo:block>
      <fo:block font-size="36pt">XXXXXX</fo:block>
      <fo:block font-size="36pt">XXXXXX</fo:block>
      <fo:block font-size="36pt">XXXXXX</fo:block>
      <fo:block font-size="36pt">XXXXXX</fo:block>
      <fo:block font-size="36pt">XXXXXX</fo:block>
      <fo:block font-size="36pt">XXXXXX</fo:block>
      <fo:block font-size="36pt">XXXXXX</fo:block>
      <fo:block font-size="36pt">XXXXXX</fo:block>
      <fo:block font-size="36pt">XXXXXX</fo:block>
      <fo:block font-size="36pt">XXXXXX</fo:block>
      <fo:block font-size="36pt">XXXXXX</fo:block>
      <fo:block font-size="36pt">XXXXXX</fo:block>
      <fo:block font-size="36pt">XXXXXX</fo:block>
      <fo:block font-size="36pt">XXXXXX</fo:block>
      <fo:block font-size="36pt">XXXXXX</fo:block>
    </fo:flow>
  </fo:page-sequence>
</fo:root>

Asi největší možnosti pak nabízí element fo:repeatable-page-master-alternatives, který obsahuje elementy fo:conditional-page-master-reference. Ty odkazují na předlohy stránek a u každého odkazu mají nastavenu podmínku, kdy se má daná předloha vybrat. Vybere se vždy první předloha, pro kterou je podmínka splněná.

Příklad 5.3. Podmíněná záhlaví – ruzna-zahlavi3.fo

<?xml version="1.0" encoding="utf-8"?>
<fo:root xmlns:fo="http://www.w3.org/1999/XSL/Format">
  <fo:layout-master-set>
    <fo:simple-page-master master-name="titlepage" margin="1in">
      <fo:region-body/>
    </fo:simple-page-master>
    <fo:simple-page-master master-name="left-master" margin="1in">
      <fo:region-body margin-top="15mm"/>        
      <fo:region-before extent="10mm" region-name="xsl-region-before-left"/>
    </fo:simple-page-master>   
    <fo:simple-page-master master-name="right-master" margin="1in">
      <fo:region-body margin-top="15mm"/>
      <fo:region-before extent="10mm" region-name="xsl-region-before-right"/>
    </fo:simple-page-master>   
    <fo:page-sequence-master master-name="main-master">
      <fo:repeatable-page-master-alternatives>
        <fo:conditional-page-master-reference master-reference="titlepage" page-position="first"/>
        <fo:conditional-page-master-reference master-reference="left-master" odd-or-even="even"/>
        <fo:conditional-page-master-reference master-reference="right-master" odd-or-even="odd"/>          
      </fo:repeatable-page-master-alternatives>        
    </fo:page-sequence-master>
  </fo:layout-master-set>
  <fo:page-sequence master-reference="main-master">
    <fo:static-content flow-name="xsl-region-before-left">
      <fo:block text-align="left"><fo:page-number/></fo:block>
    </fo:static-content>
    <fo:static-content flow-name="xsl-region-before-right">
      <fo:block text-align="right"><fo:page-number/></fo:block>
    </fo:static-content>
    <fo:flow flow-name="xsl-region-body">
      <fo:block font-size="36pt">XXXXXX</fo:block>
      <fo:block font-size="36pt">XXXXXX</fo:block>
      <fo:block font-size="36pt">XXXXXX</fo:block>
      <fo:block font-size="36pt">XXXXXX</fo:block>
      <fo:block font-size="36pt">XXXXXX</fo:block>
      <fo:block font-size="36pt">XXXXXX</fo:block>
      <fo:block font-size="36pt">XXXXXX</fo:block>
      <fo:block font-size="36pt">XXXXXX</fo:block>
      <fo:block font-size="36pt">XXXXXX</fo:block>
      <fo:block font-size="36pt">XXXXXX</fo:block>
      <fo:block font-size="36pt">XXXXXX</fo:block>
      <fo:block font-size="36pt">XXXXXX</fo:block>
      <fo:block font-size="36pt">XXXXXX</fo:block>
      <fo:block font-size="36pt">XXXXXX</fo:block>
      <fo:block font-size="36pt">XXXXXX</fo:block>
      <fo:block font-size="36pt">XXXXXX</fo:block>
      <fo:block font-size="36pt">XXXXXX</fo:block>
      <fo:block font-size="36pt">XXXXXX</fo:block>
      <fo:block font-size="36pt">XXXXXX</fo:block>
      <fo:block font-size="36pt">XXXXXX</fo:block>
      <fo:block font-size="36pt">XXXXXX</fo:block>
      <fo:block font-size="36pt">XXXXXX</fo:block>
      <fo:block font-size="36pt">XXXXXX</fo:block>
      <fo:block font-size="36pt">XXXXXX</fo:block>
      <fo:block font-size="36pt">XXXXXX</fo:block>
      <fo:block font-size="36pt">XXXXXX</fo:block>
      <fo:block font-size="36pt">XXXXXX</fo:block>
      <fo:block font-size="36pt">XXXXXX</fo:block>
      <fo:block font-size="36pt">XXXXXX</fo:block>
      <fo:block font-size="36pt">XXXXXX</fo:block>
      <fo:block font-size="36pt">XXXXXX</fo:block>
      <fo:block font-size="36pt">XXXXXX</fo:block>
      <fo:block font-size="36pt">XXXXXX</fo:block>
      <fo:block font-size="36pt">XXXXXX</fo:block>
      <fo:block font-size="36pt">XXXXXX</fo:block>
      <fo:block font-size="36pt">XXXXXX</fo:block>
      <fo:block font-size="36pt">XXXXXX</fo:block>
      <fo:block font-size="36pt">XXXXXX</fo:block>
      <fo:block font-size="36pt">XXXXXX</fo:block>
      <fo:block font-size="36pt">XXXXXX</fo:block>
      <fo:block font-size="36pt">XXXXXX</fo:block>
      <fo:block font-size="36pt">XXXXXX</fo:block>
      <fo:block font-size="36pt">XXXXXX</fo:block>
      <fo:block font-size="36pt">XXXXXX</fo:block>
      <fo:block font-size="36pt">XXXXXX</fo:block>
      <fo:block font-size="36pt">XXXXXX</fo:block>
      <fo:block font-size="36pt">XXXXXX</fo:block>
      <fo:block font-size="36pt">XXXXXX</fo:block>
      <fo:block font-size="36pt">XXXXXX</fo:block>
      <fo:block font-size="36pt">XXXXXX</fo:block>
      <fo:block font-size="36pt">XXXXXX</fo:block>
      <fo:block font-size="36pt">XXXXXX</fo:block>
      <fo:block font-size="36pt">XXXXXX</fo:block>
      <fo:block font-size="36pt">XXXXXX</fo:block>
      <fo:block font-size="36pt">XXXXXX</fo:block>
      <fo:block font-size="36pt">XXXXXX</fo:block>
      <fo:block font-size="36pt">XXXXXX</fo:block>
      <fo:block font-size="36pt">XXXXXX</fo:block>
      <fo:block font-size="36pt">XXXXXX</fo:block>
      <fo:block font-size="36pt">XXXXXX</fo:block>
      <fo:block font-size="36pt">XXXXXX</fo:block>
      <fo:block font-size="36pt">XXXXXX</fo:block>
      <fo:block font-size="36pt">XXXXXX</fo:block>
      <fo:block font-size="36pt">XXXXXX</fo:block>
      <fo:block font-size="36pt">XXXXXX</fo:block>
      <fo:block font-size="36pt">XXXXXX</fo:block>
      <fo:block font-size="36pt">XXXXXX</fo:block>
      <fo:block font-size="36pt">XXXXXX</fo:block>
    </fo:flow>
  </fo:page-sequence>
</fo:root>

Podmínka pro výběr stránky přitom může být určena pomocí následujících atributů:

page-position

Pozice stránky: first, last, rest nebo any.

odd-or-even

Sudá/lichá stránka: even, odd nebo any.

blank-or-not-blank

Pro prázdné stránky, které byly automaticky vygenerovány pro zarovnání požadovaného počtu stránek: blank, not-blank nebo any.

© 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