Listen und Aufzählungen

Es werden geordnete Listen und ungeordnete Listen (Aufzählungen) erzeugt.

Für geordnete Listen, d. s. Listen, in denen die Listenelemente fortlaufend nummeriert werden, und ungeordnete Listen, d. s. Listen, in denen die Listenelemente jeweils ein gleiches Vorzeichen bekommen, wird ein zusammenhängendes Stylesheet-Konzept demonstriert.

Auszug aus der DTD:

<!ELEMENT OL (LE+)>                                                     ❶
<!ATTLIST OL
   Typ (numerisch | alfa-klein | alfa-gross) "numerisch">               ❷
<!ELEMENT UL (LE+)>                                                     ❶
<!ATTLIST UL
   Praefix (Strich | Punkt | Ohne | Quadrat) "Strich">                  ❸
<!ELEMENT LE (A+)>
<!ELEMENT A (#PCDATA | ... | UL | OL)*>                                 ❹

❶ Die Inhaltsmodelle für geordnete und ungeordnete Listen sind gleich. In beiden Fällen sind die Unterelemente Listenelemente (LE).

❷ Die Listenelemente der geordneten Liste müssen unterschiedlich formatiert werden. An der Zählung ändert sich dadurch nichts.

❸ Die Listenelemente der ungeordneten Liste müssen mit unterschiedlichen Vorzeichen versehen werden.

❹ Listenelemente bestehen aus einem oder mehreren Textabsätzen, die wiederum Listen enthalten können. Listen werden also rekursiv verwendet.

Stylesheet:

<xsl:template match="UL | OL">                                             ❶
   <fo:list-block margin-left="0mm"                                        ❷
   provisional-distance-between-starts="10mm" 
   space-before="2mm" space-after="2mm">
      <xsl:apply-templates/>
   </fo:list-block>
</xsl:template>
...
<xsl:template match="LE">                                                  ❸
   <xsl:if test="parent::OL">                                              ❸
      <fo:list-item>                                                       ❹
         <fo:list-item-label end-indent="label-end()">                     ❹
            <fo:block>
               <xsl:choose>                                                ❺
                  <xsl:when test="parent::node()/@Typ='alfa-klein'">       ❻
                     <xsl:number format="a"/>)
                  </xsl:when>
                  <xsl:when test="parent::node()/@Typ='alfa-gross'">
                     <xsl:number format="A"/>)
                  </xsl:when>
                      <xsl:otherwise>
                         <xsl:number/>.                                    ❼
                      </xsl:otherwise>
               </xsl:choose>
            </fo:block>
         </fo:list-item-label>
         <fo:list-item-body start-indent="body-start()">                   ❹
            <fo:block>
               <xsl:apply-templates/>
            </fo:block>
         </fo:list-item-body>
      </fo:list-item>
   </xsl:if>
   <xsl:if test="parent::UL">                                             
      <fo:list-item>                                                       ❸
         <fo:list-item-label end-indent="label-end()">                  
            <fo:block>                                                     ❹
               <xsl:choose>
                  <xsl:when test="parent::node()/@Praefix='Punkt'">        ❽
                     <fo:block font-family="Arial Unicode MS">&#x2022;     ❾
                     </fo:block> 
                  </xsl:when>
                  <xsl:when test="parent::node()/@Praefix='Ohne'">         ❾
                  </xsl:when> 
                  <xsl:when test="parent::node()/@Praefix='Quadrat'">
                     <fo:block font-family="Arial Unicode MS">&#x25A1;
                     </fo:block>                                   
                  </xsl:when>
                  <xsl:otherwise>                                          ❼
                     <fo:block font-family="Arial Unicode MS">&#x2012;
                     </fo:block>
                  </xsl:otherwise>
               </xsl:choose>
            </fo:block>
         </fo:list-item-label>
         <fo:list-item-body start-indent="body-start()">                   ❹
            <fo:block>
               <xsl:apply-templates/>
            </fo:block>
         </fo:list-item-body>
      </fo:list-item> 
   </xsl:if>
</xsl:template>

❶ Die Spezifikation für geordnete und ungeordnete Listen kann in einem Template erfolgen. Auch für verschachtelte Listen wird kein eigenes Template gefordert. Sie werden automatisch entsprechend eingezogen, weil ihr linker Rand der eingezogene Rand der übergeordneten Listen-Absätze ist.

❷ Für die Listen wird ein Listen-Block (<fo:list-block>) definiert, in dem der Abstand vom linken Rand, der Raum für die Zählung bzw. das Vorzeichen der Listenelemente sowie die Abstände oben und unten spezifiziert sind. Weitere typografische Attribute, die für die Listen insgesamt gelten und vererbbar sind, können hier hinzugefügt werden. Der Listen-Block besteht aus beliebig vielen Listenelementen (<fo:list-item>).

❸ Auch für die Listenelemente wird lediglich ein Template benötigt. Die unterschiedliche Behandlung von Listenelementen in geordneten und ungeordneten Listen wird durch die <xsl:if>-Bedingung geregelt.

❹ Ein Listenelement besteht jeweils aus dem Paar von <fo:list-item-label> und <fo:list-item-body>.

❺ Das <xsl:choose>-Konstrukt muss hier angewandt werden, um die Vorgabe für die Formatierung der Nummerierung innerhalb der geordneten Liste zu berücksichtigen.

❻ Wenn im Elternelement <OL> für das Attribut Typ der Attributwert alfa-klein spezifiziert ist, dann soll die Nummerierung mit Kleinbuchstaben und der schließenden Klammer als Interpunktionszeichen erfolgen.

❼ Die Fallunterscheidung <xsl:otherwise> gilt für den Attributwert, der in der DTD als Vorgabewert spezifiziert ist, bzw. für den Fall, dass das Attribut überhaupt nicht spezifiziert ist.

❽ Das <xsl:choose>-Konstrukt muss hier angewandt werden, um die Vorgabe für die Vorzeichen innerhalb der ungeordneten Liste zu berücksichtigen.

❾ Wenn im Elternelement <UL> für das Attribut Praefix der Attributwert Punkt spezifiziert ist, dann soll das Vorzeichen ein auf Mitte gestellter fetter Punkt sein. Das Zeichen ist durch eine Unicode-Zeichenreferenz dargestellt. Für den Attributwert Ohne gilt, dass kein Vorzeichen erscheint (eine sogenannte einfache Liste).

 

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