Inhaltsverzeichnisse

Erstellung von Inhaltsverzeichnissen mit Nummerierung der Einträge und Referenzierung auf die Seitenzahlen des Inhalts.

In diesem Beispiel wird demonstriert, wie ein Inhaltsverzeichnis aus den Inhalten generiert wird. Das Inhaltsverzeichnis enthält die automatische Nummerierung der Inhaltsverzeichnis-Einträge und die Referenzierung auf die Seitenzahlen des Inhalts. Das folgende Stylesheet geht von der Voraussetzung aus, dass in der DTD ein leeres Inhaltsverzeichnis-Element definiert ist. Das Beispiel bezieht sich auf die einfache Anforderung, lediglich Inhaltsverzeichnis-Einträge einer Ebene im Inhaltsverzeichnis darzustellen.

Auszug aus der DTD:

<!ELEMENT Werk (Titel, ..., Inhalt, Abschnitt+)>        ❶ 
<!ELEMENT Inhalt EMPTY>                                 ❷ 
...
<!ELEMENT Abschnitt (Titel, ...)>                       ❸ 

❶ Das Element <Inhalt> bezeichnet den Platz, den das Inhaltsverzeichnis in der Elementfolge einnehmen soll.

❷ Der Tag <Inhalt> ist lediglich ein Platzhalter in der XML-Instanz, ohne jede Unterstruktur. Die Spezifikation des Inhaltsverzeichnisses erfolgt vollständig im Stylesheet.

❸ Für die Generierung des Inhaltsverzeichnisses ist es wichtig, dass wirklich jeder Abschnitt einen Titel hat. Was sollte man sonst im Inhaltsverzeichnis für diesen Abschnitt eintragen?

Stylesheet:

...
<xsl:template match="Abschnitt">
   <fo:block id="{generate-id()}">
      <xsl:apply-templates/>                                                            ❶
   </fo:block>
</xsl:template>
...
<xsl:template match="Inhalt">                                                           ❷
   <fo:block font-size="18pt" font-weight="bold" text-align="center" space-after="6mm"> ❸
      Inhaltsverzeichnis
   </fo:block>
   <xsl:for-each select="Abschnitt">
      <xsl:call-template name="ivz.zeile"/>                                             ❹
   </xsl:for-each>                                                                      ❺
</xsl:template>
...
<xsl:template name="ivz.zeile">                                                         ❺
   <fo:block text-align-last="justify">                                                 ❻
      <fo:table width="160mm">                                                          ❼
         <fo:table-column column-number="1" column-width="10mm"/>                       ❼ 
         <fo:table-column column-number="2" column-width="150mm"/>                      ❼ 
         <fo:table-body>
            <fo:table-row> 
               <fo:table-cell column-number="1">
                  <fo:block>
                     <xsl:number level="single" count="Abschnitt" format="1."/>         ❽ 
                  </fo:block>
               </fo:table-cell>
               <fo:table-cell column-number="2">
                  <fo:block> 
                     <xsl:value-of select="Titel"/>                                     ❾ 
                     <fo:inline>
                        <fo:leader leader-pattern="dots"/>                              ❾
                     </fo:inline>
                     <fo:page-number-citation ref-id="{generate-id()}"/>                ❾
                  </fo:block>
               </fo:table-cell>
            </fo:table-row>
         </fo:table-body>
      </fo:table>
   </fo:block>
</xsl:template>

❶ Für jeden Abschnitt wird im XSLT-Prozess eine eindeutige Identifikation generiert. Auf diese Identifikatoren greift der Formatierer zu, wenn er mit dem Element <fo:page-number-citation> auf die Abschnitte referenziert, um die Seitenzahlen für den Beginn der Abschnitte in das Inhaltsverzeichnis zu übertragen.

❷ Dieses Template spezifiziert die Generierung des Inhaltsverzeichnisses. Enthielte die DTD kein Platzhalter-Element für das Inhaltsverzeichnis, würde der Inhalt dieses Templates (nicht das Template selbst!) in einer Seitenfolge (<fo:page-sequence>) und darin innerhalb von <fo:flow> stehen.

❸ Dies ist der Block für die Überschrift des Inhaltsverzeichnisses ein­schließ­lich der Überschriften-Formulierung.

❹ Für jeden Abschnitt gilt das in <xsl:for-each> Spezifizierte.

❺ An Stelle der Spezifikation für jeden Inhaltsverzeichnis-Eintrag wird ein benanntes Template (<xsl:call-template>) mit dem Namen ivz.zeile aufgerufen. Die Inhalte dieses Templates könnten auch an Stelle des Template-Aufrufs stehen. Die getrennte Template-Spezifikation soll lediglich eine bessere Übersicht im Stylesheet schaffen, weil diese sehr umfangreich sein kann und bei integrierter Behandlung den Blick auf die größeren Zusammenhänge erschwert.

❻ Der Block, der einen Inhaltsverzeichnis-Eintrag mit der Seitenzahl umschließt, soll in der letzten Zeile des Eintrags Block setzen, d. h. die Seitenzahl an den rechten Satzspiegelrand setzen. Das Attribut text-align-last vererbt sich auf die Unterstrukturen.

❼ Es wird für jeden Inhaltsverzeichnis-Eintrag eine einzeilige Tabelle erzeugt, die die Daten des Eintrags aufnimmt. Die Tabelle hat zwei Spalten, eine für die Nummerierung der Einträge (Abschnitte), eine zweite für die Abschnitts-Überschriften. Die Nummerierungen sind also freigestellt und die Überschriften sind auch bei umlaufenden Zeilen einheitlich links aliniiert.

❽ Das Element <xsl:number> erzeugt die Nummerierung der Abschnitts-Überschriften.

❾ In der zweiten Spalte werden innerhalb eines Blocks folgende Dinge eingefügt: Zunächst der Inhalt von <Titel> des gegebenen Abschnitts (ohne ggf. darin auftretende Unterstrukturen!). In der letzten Zeile dieses Blocks, zwischen dem Ende des Überschriftentextes und der Seitenzahl, wird durch das Element <fo:leader> eine punktierte Linie generiert. Am rechten Rand erscheint die Seitenzahl, d. h. die Zahl der Seite, in der der Block mit dem entsprechenden generierten Identifikator beginnt. Der Formatierer löst den Verweis der id-ref-id-Beziehung durch Einfügung der Seitenzahl auf.

 

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