Komplexe Seitenfolgen-Vorlagen

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 funktionierenden 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.

Auszug aus der DTD:

<!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.

Stylesheet:

<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 siehe 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 >>
Tipp der data2type-Redaktion:
Zum Thema XSL-FO bieten wir auch folgende Schulungen zur Vertiefung und professionellen Fortbildung an:

Copyright © dpunkt.verlag GmbH 2004
Für Ihren privaten Gebrauch dürfen Sie die Online-Version ausdrucken.
Ansonsten unterliegt dieses Kapitel aus dem Buch "XSL-FO in der Praxis" denselben Bestimmungen, wie die gebundene Ausgabe: Das Werk einschließlich aller seiner Teile ist urheberrechtlich geschützt. Alle Rechte vorbehalten einschließlich der Vervielfältigung, Übersetzung, Mikroverfilmung sowie Einspeicherung und Verarbeitung in elektronischen Systemen.

dpunkt.verlag GmbH, Ringstraße 19B, 69115 Heidelberg, fon 06221-14830, fax 06221-148399, hallo(at)dpunkt.de