Listen
XSL-FO enthält die Möglichkeit, Listen zu erzeugen. Hierfür wird zu allererst das Element list-block benötigt. In
diesem Element werden nun list-item-Elemente untergeordnet, welche die einzelnen Listenpunkte repräsentieren.
Jeder Listenpunkt enthält nun genau zwei weitere Unterelemente: list-item-label und list-item-body.
Das list-item-label stellt die Beschriftung für den Listenpunkt dar. Dies ist i. d. R. ein Aufzählungszeichen
oder ein fortlaufender Wert (nummerisch, alphanummerisch oder römisch). XSL-FO enthält selbst keinen Mechanismus, um eine solche
geordnete Aufzählung zu erzeugen. Hier wird dann meistens das number-Element von XSLT verwendet, um einen solchen
Aufzählungswert zu erzeugen (siehe Beispiel). Der eigentliche Inhalt des Aufzählungspunkts wird im Element
list-item-body notiert. Sowohl im list-item-label- als auch im list-item-body-Element
darf der Inhalt nicht direkt notiert werden, sondern muss in einem block-Element untergeordnet werden. Standardmäßig
überlagert sich der Inhalt der Elemente list-item-label und list-item-body. Um einen Abstand zu
erzeugen, werden üblicherweise die Attribute start-indent und end-indent verwendet.
XML-Code:
<?xml version="1.0" encoding="UTF-8" standalone="yes" ?>
<?xml-stylesheet href="listen.xsl" type="text/xsl" ?>
<zahlen>
<zahl>45</zahl>
<zahl>39</zahl>
<zahl>22</zahl>
<zahl>70</zahl>
<zahl>68</zahl>
<zahl>12</zahl>
<zahl>51</zahl>
<zahl>63</zahl>
<zahl>27</zahl>
<zahl>94</zahl>
</zahlen>
XSL-Code:
<?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:output method="xml" omit-xml-declaration="no" version="1.0" encoding="UTF-8" indent="yes" />
<xsl:template match="/">
<fo:root>
<fo:layout-master-set>
<fo:simple-page-master master-name="DIN-A4" page-height="297mm" page-width="210mm">
<fo:region-body region-name="inhalt" margin="2cm" />
</fo:simple-page-master>
</fo:layout-master-set>
<fo:page-sequence master-reference="DIN-A4">
<fo:flow flow-name="inhalt">
<fo:list-block>
<xsl:apply-templates />
</fo:list-block>
</fo:flow>
</fo:page-sequence>
</fo:root>
</xsl:template>
<xsl:template match="/zahlen/zahl">
<fo:list-item>
<fo:list-item-label>
<fo:block>
<xsl:number format="1." />
</fo:block>
</fo:list-item-label>
<fo:list-item-body start-indent="10mm">
<fo:block>
<xsl:value-of select="." />
</fo:block>
</fo:list-item-body>
</fo:list-item>
</xsl:template>
</xsl:stylesheet>
Wichtig: Im obigen Beispiel wird ein fest definierter Abstand verwendet. Nachteil dieser Variante ist die Abhängigkeit
der Schriftgröße sowie der evtl. zu kleine Abstand bei langen Aufzählungen. Abhilfe schafft der Attributwert label-end()
im Attribut end-indent des list-item-label-Elements sowie der Attributwert body-start()
im Attribut start-indent des list-item-body-Elements. Der Abstand zwischen dem list-item-label-
und list-item-body-Element lässt sich dann über das Attribut provisional-distance-between-starts,
welches im list-block-Element notiert wird, festlegen. Der Standardwert dieses Attributs ist 24pt.