Das vorhergehende Beispiel einer einfachen Seitenfolge wird zu einem mit einer komplexen Seitenfolge erweitert.
Die Spezifikation einer komplexen Seitenfolge stellt oft eine hohe Hürde auf dem Weg zu einem funktionierendem Stylesheet dar. Das folgende Beispiel orientiert sich an dem hier vorliegenden Buch. Dieses ist auf der ersten Ebene in Teile gegliedert, darunter in Beiträge. Der Teil-Titel soll jeweils für sich auf einer eigenen, rechten Seite stehen. Die Rückseite bleibt leer (vakat). Jeder Beitrag beginnt auf einer neuen rechten Seite mit dem Beitrags-Titel und dem danach folgenden Inhalt.
<!ELEMENT Werk (Titelei, Teil+)> ❶
<!ELEMENT Teil (Titel, Beitrag+)> ❷
<!ELEMENT Beitrag (Titel, ...)> ❸
❶ Das Werk (Buch) besteht – nach der hier nicht behandelten Titelei – aus Teilen (<Teil>).
❷ Jeder Teil besteht aus einem Titel und danach beliebig vielen Beiträgen.
❸Jeder Beitrag beginnt mit einem Beitrags-Titel. Danach kommt der Beitrags-Inhalt.
<xsl:template match="/"> ❶
<fo:root>
<fo:layout-master-set>
<fo:simple-page-master master-name="PageMaster.Inhalt-rechts"
margin="15mm 25mm 30mm 13mm" page-height="297mm" page-width="210mm">
<fo:region-before region-name="Inhalt-rechts-davor" extent="20mm"
display-align="before" border-after-style="solid"
border-after-width="1pt"/>
<fo:region-after region-name="Inhalt-rechts-danach"
border-before-style="none" extent="10mm" display-align="after"/>
<fo:region-body margin="5mm 0mm 7mm 0mm"/>
</fo:simple-page-master>
<fo:simple-page-master master-name="PageMaster.Inhalt-links" ❷
margin="15mm 13mm 30mm 25mm" page-height="297mm" page-width="210mm">
<fo:region-before region-name="Inhalt-links-davor" extent="20mm"
display-align="before" border-after-style="solid"
border-after-width="1pt"/>
<fo:region-after region-name="Inhalt-links-danach"
border-before-style="none" extent="10mm" display-align="after"/>
<fo:region-body margin="5mm 0mm 7mm 0mm"/>
</fo:simple-page-master>
<fo:simple-page-master master-name="PageMaster.Inhalt-rechts-start" ❸
margin="15mm 25mm 30mm 13mm" page-height="297mm" page-width="210mm">
<fo:region-before region-name="Inhalt-rechts-davor-start"
extent="20mm" display-align="before" border-after-style="solid"
border-after-width="1pt"/>
<fo:region-after region-name="Inhalt-rechts-danach"
border-before-style="none" extent="10mm" display-align="after"/>
<fo:region-body margin="5mm 0mm 7mm 0mm"/>
</fo:simple-page-master>
<fo:simple-page-master master-name="PageMaster.Teil-Titelseite"
margin="15mm 25mm 30mm 13mm" page-height="297mm" page-width="210mm">
<fo:region-body region-name="Teil-Titelseite-Hauptbereich"
margin="0mm 0mm 0mm 0mm"/>
</fo:simple-page-master>
<fo:page-sequence-master master-name="Teil-Seiten"> ❹
<fo:repeatable-page-master-alternatives>
<fo:conditional-page-master-reference
master-reference="PageMaster.Teil-Titelseite"
page-position="rest" odd-or-even="odd"/>
</fo:repeatable-page-master-alternatives>
</fo:page-sequence-master>
<fo:page-sequence-master master-name="Inhalt-Seiten"> ❺
<fo:repeatable-page-master-alternatives>
<fo:conditional-page-master-reference
master-reference="PageMaster.Inhalt-rechts-start"
page-position="first" odd-or-even="odd"/>
<fo:conditional-page-master-reference
master-reference="PageMaster.Inhalt-links"
page-position="rest" odd-or-even="even"/>
<fo:conditional-page-master-reference
master-reference="PageMaster.Inhalt-rechts"
page-position="rest" odd-or-even="odd"/>
<fo:conditional-page-master-reference
master-reference="PageMaster.Inhalt-links"
page-position="last" odd-or-even="even"/>
<fo:conditional-page-master-reference
master-reference="PageMaster.Inhalt-rechts"
page-position="last" odd-or-even="odd"/>
</fo:repeatable-page-master-alternatives>
</fo:page-sequence-master>
</fo:layout-master-set>
<xsl:for-each select="Teil"> ❻
<fo:page-sequence master-reference="Teil-Seiten"
force-page-count="even" >
<xsl:if test="not(preceding-sibling::Teil)">
<xsl:attribute
name="initial-page-number">1</xsl:attribute> ❼
</xsl:if>
<fo:flow flow-name="Teil-Titelseite-Hauptbereich">
<fo:block margin-before="50mm" text-align="center">
<xsl:apply-templates select="Titel"/>
</fo:block>
</fo:flow>
</fo:page-sequence>
<xsl:for-each select="Beitrag"> ❽
<fo:page-sequence master-reference="Inhalt-Seiten"
force-page-count="even" >
<fo:static-content flow-name="Inhalt-rechts-davor-start">
<fo:block>Kopfbereich rechts erste Seite</fo:block>
</fo:static-content>
<fo:static-content flow-name="Inhalt-rechts-davor">
<fo:block>Kopfbereich rechts</fo:block>
</fo:static-content>
<fo:static-content flow-name="Inhalt-links-davor">
<fo:block>Kopfbereich links</fo:block>
</fo:static-content>
<fo:static-content flow-name="Inhalt-rechts-danach">
<fo:block>Fußbereich rechts</fo:block>
</fo:static-content>
<fo:static-content flow-name="Inhalt-links-danach">
<fo:block>Fußbereich links</fo:block>
</fo:static-content>
<fo:flow flow-name="xsl-region-body">
<fo:block>
<xsl:apply-templates select="."/> ❾
</fo:block>
</fo:flow>
</fo:page-sequence>
</xsl:for-each>
</xsl:for-each>
</fo:root>
</xsl:template>
❶ Für alle nicht kommentierten Teile des Stylesheets s. das vorhergehende Beispiel für einfache Seitenfolgen-Vorlagen.
❷ Hinzugekommen ist eine Seitenvorlage für die ersten Seiten eines jeden Beitrags.
❸ Hinzugekommen ist eine Seitenvorlage für die Teil-Titelseite. Für die Rückseite der Teil-Titelseite wird keine Seitenvorlage benötigt, da diese Seite vollständig leer ist.
❹ Hinzugekommen ist eine Seitenfolgen-Vorlage für die Teil-Titel.
❺ Die Seitenfolgen-Vorlage für die Inhalt-Seiten ist um zwei <fo:conditional-page-master-reference>-Elemente erweitert worden. Diese gelten für jeweils die letzte Seite eines Beitrages, je nachdem, ob diese Seite eine rechte oder linke Seite ist. Im Unterschied zu den Rückseiten der Teil-Titel sind diese letzten Seiten nicht vollständig leer. Sie beinhalten den Kopf- und Fußbereich, wie er auf den nicht-letzten Seiten erscheint. Als Seitenvorlage wird die für die normalen Inhalt-Seiten benutzt.
❻ Hier wird eine Lösung demonstriert, die das Verschachteln von Seitenfolgen-Vorlagen (hier für Teil-Titel, jeweils mit leerer Rückseite, danach für die Beiträge in Teilen) innerhalb des XSL-FO-Konzepts vermeidet. Stattdessen wird mit dem XSLT-Konzept gearbeitet: Mit <xsl:for-each> wird jeder Teil (<Teil>) entsprechend den darin befindlichen Spezifikationen behandelt. Der <fo:flow> wird mit jedem neuen Teil erneut gestartet. Innerhalb dieser durch <xsl:for-each select="Teil"> spezifizierten Schleife wird nach dem Teiltitel eine weitere Schleife definiert (<xsl:for-each select="Beitrag">).
❼ Damit nicht mit jedem weiteren Teil die Seitennummerierung wieder mit 1 begonnen wird, muss jeweils abgefragt werden, ob der gegebene Teil keinen Vorläufer hat. Die Seitennummerierung wird lediglich dann mit 1 begonnen, wenn der Teil wirklich der erste ist.
❽ Hier beginnt die untergeordnete Schleife für die Beiträge.
❾ Das select-Attribut mit seinem Wert "." sorgt dafür, dass jeweils nur der Beitrag einbezogen wird, der gerade mit <xsl:for-each> verarbeitet wird.
| << zurück |
vor >> |