XSL Formatting Objects (XSL FO)

Az alábbi folyamatábra bemutatja a DocBook forrásból generált outputok lehetséges skáláját:

Az XSL FO egy olyan XML domén, ami a dokumentumok megjelenítésének alacsony szintjét definiálja: lapok, margók, fejlécek, hasonlók definícióit. Az XSL FO elég alacsonyszintű és komplex, ezért nem szoktuk kézzel létrehozni, hanem generáljuk, típikusan XSLT segítségével. Ezután még "renderelni" kell az XSL FO-t, hogy a végső megjelenítést, pl. PS vagy PDF formátummá végrehajtsa.

Az XSL FO fájl egy XML dokument, tehát van gyökér eleme:


<?xml version="1.0" encoding="utf-8"?>
<fo:root>
  ...
</fo:root>

A maradék struktúra az alábbi:

A gyökérelem után a pagelayout-okat kell leírnunk. Elsőként leírjuk, hogy milyen formátumok léteznek. A lenti ábrán három fajta layout-ot látunk, melyekben különbözőek a bal- és jobboldali margók, illetve a fűzési terület. Ugyancsak definiáltunk egy területet a fejlécnek és a margónak.

Először a lapmáretekkel kezdünk. A méreteket meg lehet adni centiméterben, de más CSS egységben is, mint pl. px (pixel) vagy pt (point). Mindegyik elem simple-page-master típusú tag, és definiálnia kell egy master-name attribútumot.


<fo:layout-master-set>
    <fo:simple-page-master master-name="cover"
        page-height="12cm"
        page-width="12cm"
        margin-top="0.5cm"
        margin-bottom="0.5cm"
        margin-left="1cm"
        margin-right="0.5cm">
    </fo:simple-page-master>

    <fo:simple-page-master master-name="leftPage"
        page-height="12cm"
        page-width="12cm"
        margin-left="0.5cm"
        margin-right="1cm"
        margin-top="0.5cm"
        margin-bottom="0.5cm">
    </fo:simple-page-master>

    <fo:simple-page-master master-name="rightPage"
        page-height="12cm"
        page-width="12cm"
        margin-left="1cm"
        margin-right="0.5cm"
        margin-top="0.5cm"
        margin-bottom="0.5cm">
    </fo:simple-page-master>

    <!-- more info will go here -->
</fo:layout-master-set>

A margók nem tartalmaznak kiírandó adatokat. A margókon belüli adatok alkotják a tartalom számára fenntartott helyet, az un. page-reference-area-t.

A page-reference-area öt részre oszlik:

Egy kis terminológia. A lapok kétféle tartalommal rendelkeznek: blokk elemekkel, melyek új sorban kezdődnek, és inline-elemekből, mint pl. bold vagy italic. Az ún. blokk feldolgozás haladási irány (blokk-progress-direction) a bekezdések lapra történő elhelyezésének sorrendjét adja meg. A megelőző él (before-edge) megelőzi az elemet, követő él (after-edge) pedig az elem után kerül megjelenítésre. Az soron belüli feldolgozási irány (inline-progress-direction) a karakterek megjelenését határozza meg a soron belül. Itt kezdő él (start edge) és záró él (end-edge) létezik.

Eltérő nyelvekben ezek a sorrendek akár eltérőek is lehetnek:

Ennek az egész bonyolult szakszövegnek az az értelme, hogy nyelvfüggetlen fogalmakat vezessünk be. Ha pl. a fejlécet a bal helyett a jobboldalon szeretnénk kezdeni, akkor elég a text-align="end" értéket beállítani.

Ha a szöveget, pl. arabra vagy japánra fordítják, akkor a fejléc ott is az ellentétes helyen fog megjelenni, akármi is az ellentétes jelentése.

A címlap számára szükségtelen fejléc és lábléc definiálására.


    <fo:simple-page-master master-name="cover"
            page-height="12cm"
            page-width="12cm"
            margin-top="0.5cm"
            margin-bottom="0.5cm"
            margin-left="1cm"
            margin-right="0.5cm">
            <fo:region-body
                margin-top="3cm" />
        </fo:simple-page-master> 

A címlap számára szükségtelen a fejléc és a lábléc definiálása.


    <fo:simple-page-master master-name="cover"
            page-height="12cm"
            page-width="12cm"
            margin-top="0.5cm"
            margin-bottom="0.5cm"
            margin-left="1cm"
            margin-right="0.5cm">
            <fo:region-body
                margin-top="3cm" />
        </fo:simple-page-master> 

A bal- és jobboldali lapok számára szükséges a fej- és lábléc létrehozása. Ezért definiáljuk az extent attribútumot a region-before és region-after számára.


  <fo:simple-page-master master-name="leftPage"
            page-height="12cm"
            page-width="12cm"
            margin-left="0.5cm"
            margin-right="1cm"
            margin-top="0.5cm"
            margin-bottom="0.5cm">
            <fo:region-before extent="1cm"/>
            <fo:region-after extent="1cm"/>
            <fo:region-body 
                margin-top="1.1cm"
                margin-bottom="1.1cm" />
        </fo:simple-page-master>

        <fo:simple-page-master master-name="rightPage"
            page-height="12cm"
            page-width="12cm"
            margin-left="1cm"
            margin-right="0.5cm"
            margin-top="0.5cm"
            margin-bottom="0.5cm">
            <fo:region-before extent="1cm"/>
            <fo:region-after extent="1cm"/>
            <fo:region-body 
                margin-top="1.1cm"
                margin-bottom="1.1cm" />
        </fo:simple-page-master> 

Miután definiáltuk a lapok szerkezetét, megadhatjuk, hogy milyen sorrendben lesznek használva a page-master-ek, amikor a lapokat generáljuk.