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.
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).
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ů:
Pozice stránky: first
,
last
, rest
nebo any
.
Sudá/lichá stránka: even
,
odd
nebo any
.
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
.