Publishing

(Auszug aus "Schematron - Effiziente Business Rules für XML-Dokumente", Kapitel 8)

XML-Dokumente für Print-Publishing

Beim Arbeiten mit XML-Dokumenten für Satzarbeiten kann es zu einer Reihe von Unstimmigkeiten in der Dokumentstruktur und dessen Inhalten kommen. Dabei zeigt sich häufig, dass etablierte XML-Dokumentformate wie z.B. DocBook oder DITA, die rekursive Elementstrukturen verwenden, eine Vielzahl von Konfliktfällen verursachen, die mit dem Medium »Print« und seinen begrenzten Anzeigemöglichkeiten zusammenhängen.

Die folgende DocBook-Instanz ist gespickt mit einer Reihe dieser spezifischen Probleme.

DocBook-Instanz

<article xmlns="http://docbook.org/ns/docbook" version="5.0">
  <info>
    <title>XSL-Funktionen</title>
  </info>
  <sect1>
    <title>XSL-Funktionen</title>
    <para>Dieses Kapitel beschäftigt sich mit den wichtigsten XSL-Funktionen, ungeachtet, ob es sich dabei um XSLT- oder <?zusammenhalten start?> XPath-Funktionen <?zusammenhalten end?> handelt. Im Referenz-Teil befinden sich jeweils kurze Beschreibungen zu sämtlichen XSL-Funktionen. Hier werden wir lediglich auf jene Funktionen näher und mit beispielhaften Anwendungen eingehen, die in <?d2t_zusammenhalten anfang?> XSL-FO <?d2t_zusammenhalten ende?> Stylesheets typischerweise und häufig benutzt werden.<footnote>
      <para>Vgl. Montero, Manuel, "Professionelle XML-Verarbeitung mit Word: WordML und SmartDocuments"<footnote>
        <para>Erschienen beim dpunkt.verlag.</para>
        </footnote></para>
      </footnote></para>
    <para>Um einen ersten Überblick zu geben, welche Funktionen welcher Recommendation zuzuordnen sind, folgt hier eine Liste sämtlicher Funktionen:</para>
    <para>Zu XPath gehören thematisch geordnet:</para>
    <itemizedlist>
      <listitem>
        <para>XPATH 1.0</para>
        <itemizedlist>
          <listitem>
            <para>Knotenmengen-Funktionen:</para>
            <itemizedlist>
              <listitem>
                <para>Zählfunktionen:</para>
                <itemizedlist>
                  <listitem>
                    <para>count()</para>
                  </listitem>
                  <listitem>
                    <para>last()</para>
                  </listitem>
                </itemizedlist>
              </listitem>
            </itemizedlist>
          </listitem>
        </itemizedlist>
      </listitem>
    </itemizedlist>
    <para>Bitte tragen Sie hier Ihren Namen ein: _________</para>
  </sect1>
</article>

Processing Instructions überprüfen

Bei der professionellen Erstellung von Publikationen aus XML-Daten muss man zur Steuerung des Umbruchs häufig Steuerungsanweisungen in das jeweilige XML-Dokument einbringen. Der XML-Standard sieht für diesen Anwendungsfall die Verwendung von Processing Instructions (PIs) vor. Beispielsweise könnte die folgende PI bedeuten, dass von <?zusammenhalten start?> bis <?zusammenhalten end?> kein Zeilenumbruch erfolgen darf. Arbeiten nun verschiedene Personen im Laufe der Jahre an einem Dokument, sollte z.B. ein Verlag bestrebt sein, die im Dokument vorhandenen Steuerungsanweisungen zu vereinheitlichen. Darüber hinaus würde man auch eine Dokumentation zur korrekten Verwendung der eingesetzten PIs erwarten. Das folgende Schematron-Pattern definiert die »korrekte« Verwendung von PIs, indem es prüft, ob jeder PI das Präfix d2t_ vorangestellt wurde.

<pattern id="PIs">
  <rule context="processing-instruction()">
    <assert test="starts-with(name(),'d2t_')">Diese PI stammt nicht von data2type, bitte dokumentieren Sie Ihre Funktion. Name der PI: <value-of select="name()"/></assert>
  </rule>
</pattern>

Satztechnische Schwierigkeiten

Anders als eine Dokumentseite im Internet hat eine zu druckende Seite immer feste geometrische Grenzen, in denen sich das Layout und der Inhalt eines Dokumentes befinden. Da medienneutrale XML-Daten den jeweiligen Ausgabekanal oft nicht in ihrer Struktur abbilden, können sich Konflikte ergeben, die mit der Begrenzung einer Seite zusammenhängen. Nachfolgend werden zwei dieser möglichen Probleme exemplarisch vorgestellt.

Listen werden in XML üblicherweise so definiert, dass sie rekursiv verwendet werden können. Das heißt, ein Listencontainer enthält Listenpunkte, die wiederum andere Listen enthalten können:

<itemizedlist>
  <listitem>
    <para>Zählfunktionen:</para>
    <itemizedlist>
      <listitem>
        <para>count()</para>

Durch die Verschachtelung wird eine Hierarchie erzeugt. Hier ist der Absatz <para>Zählfunktionen:</para> in der ersten Ebene. Der Absatz <para>count()</para> in der zweiten.

Bei der Darstellung auf Papier kann sich nun das Problem ergeben, dass, je nach Satzspiegel und Einrückungstiefe, immer nur eine bestimmte Anzahl an Listen­ebenen darstellbar bzw. typografisch noch vertretbar ist.

Das folgende Schematron-Pattern prüft daher die Anzahl der Listenhierarchien und meldet bei einer Verschachtelung, die über mehr als zwei Ebenen geht, einen Fehler:

<pattern id="Listen">
  <rule context="db:listitem">
    <report test="count(ancestor::db:listitem) &gt; 2"> Eine Liste darf nicht mehr als drei Ebenen haben. Wir sind in der <value-of select="count(ancestor::db:listitem)+1"/>. Ebene.</report>
  </rule>
</pattern>

Als weiteres Beispiel sollen Fußnoten dienen. Fußnoten sind Inline-Elemente und daher in allen Blockelementen zugelassen (wie z.B. Absätze, Listenpunkte, Tabellenzellen, Überschriften usw.). Fußnoten beinhalten aber auch wiederum diese Blockelemente selbst, was zur rekursiven Verwendung führen kann. Ein Beispiel dafür wäre, dass eine Fußnote eine Tabelle enthalten kann, die wiederum eine Fußnote enthält, was im Printlayout oft nicht mehr sinnvoll darstellbar ist.

Das folgende Pattern verhindert verschachtelte Fußnoten:

<pattern id="Fussnoten">
  <rule context="db:footnote">
    <report test=".//db:footnote">Eine Fußnote darf sich nicht in einer Fußnote befinden.</report>
  </rule>
</pattern>

Verwendung von Zeichen

Neben der Überprüfung von Elementstrukturen lassen sich mit Schematron auch Inhalte von Zeichenketten überprüfen. Gerade im dokumentzentrierten Umfeld kann es eine Vielzahl von Unstimmigkeiten geben. Das folgende Beispiel soll stellvertretend für diese Fehlergruppe das Problem aufzeigen: In einem Absatz werden mehrere Unterstriche hintereinander verwendet, um eine Linie zu erzeugen.

<para>Bitte tragen Sie hier Ihren Namen ein: _________</para>

Die Verwendung von Zeichen zur Darstellung von grafischen Elementen (in diesem Fall einer Linie) kann je nach Kontext und Ausgabemedium zu gravierenden Darstellungsfehlern führen. Beispielsweise könnte bei entsprechendem Layout ein solches Konstrukt dazu führen, dass die Unterstriche durch einen Zeilen- oder Seitenumbruch getrennt werden.

Das folgende Pattern prüft das Quelldokument auf die Verwendung von mehr als drei Unterstrichen in Folge, was mit großer Wahrscheinlichkeit auf einen »Character-Abuse« hindeutet.

<pattern id="Zeichen">
  <rule context="text()">
    <report test="contains(.,'____')"> Mehr als drei Unterstriche hintereinander. Ein Missbrauch kann nicht ausgeschlossen werden.</report>
  </rule>
</pattern>

Die Funktion contains() prüft für jeden Textknoten, ob mehr als vier Unter­striche hintereinander verwendet wurden.

   

<< zurück vor >>

 

 

 

Tipp der data2type-Redaktion:
Zum Thema Schematron bieten wir auch folgende Schulungen zur Vertiefung und professionellen Fortbildung an:

Copyright © dpunkt.verlag GmbH 2011
Für Ihren privaten Gebrauch dürfen Sie die Online-Version ausdrucken. Ansonsten unterliegt dieses Kapitel aus dem Buch "Schematron - Effiziente Business Rules für XML-Dokumente" 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