XML-Know How

Das erste Schematron-Schema

Nachdem wir nun das grundlegende Datenmodell von Schematron kennen, können wir loslegen und ein erstes Schema schreiben. Zunächst soll nur eine einzelne Businessrule überprüft werden. Dazu greifen wir auf das Beispiel am Beginn dieses Artikels zurück.

Die Anforderung möge heißen:

„In Fließtexten sollen Auszeichnungen erlaubt sein, in Zitaten dagegen nicht.“

Richtig gemäß dieser Anforderung wäre der nachfolgende Ausschnitt:

<absatz typ="fliesstext">
    Rick Jelliffe beschrieb <fett>Schematron</fett> als:
</absatz>

Falsch hingegen dieser Teil:

<absatz typ="zitat">
    „den Staubwedel der auch anStellen kommt, die <fett>andere
    Validierungssprachen</fett> nichterreichen können“.
</absatz>

Die genannte Anforderung lässt sich in folgendes Schematron-Schema fassen:

<?xml version="1.0"encoding="UTF-8"?>
<sch:schemaxmlns:sch="http://purl.oclc.org/dsdl/schematron">
    <sch:pattern>
       <sch:rule context="absatz[@typ= 'zitat']">
           <sch:report test="fett">
              Zitate dürfen keineAuszeichnungen enthalten.
           </sch:report>
          </sch:rule>
    </sch:pattern>
</sch:schema>

Wenn nun eine XML-Instanz gegen das Schematron-Schema validiert wird, in der ein Zitat mit Auszeichnungen vorkommt, bekommt der Anwender die sprechende Fehlermeldung: „Zitate dürfen keine Auszeichnungen enthalten“. Betrachten wir die beiden XPath-Ausdrücke etwas genauer, die zusammen unsere Businessrule beschreiben:

Der erste Ausdruck ist der Lokalisierungspfad, der festlegt, für welchen Kontext die Regel gelten soll. Der Knotentext absatz wählt alle Knoten dieses Namens aus. Durch das Prädikat [@typ = 'zitat'] wird diese Auswahl anschließend noch weiter gefiltert. Das bedeutet, dass ein Absatz anderen Typs gar nicht erst von der Regel überprüft wird.

Der zweite Ausdruck testet den Kontextknoten und gibt je nach Testergebnis einen booleschen Wahrheitswert zurück. Der Knotentest fett überprüft demnach, ob es einen Kindknoten mit diesem Namen gibt. Weil der Ausdruck in einem <sch:report>-Element steht, wird die Fehlermeldung immer dann ausgegeben, wenn der boolesche Ausdruck den Wert „true“ zurückgibt.

Durch dieses einfache Prinzip „Setzen eines Kontextknotens und Testen eines booleschen Ausdrucks“, lassen sich hochkomplexe logische Beziehungen vergleichsweise einfach abfragen. Durch die Kombination von Achsen, Knotentests, Prädikaten und der umfangreichen Sammlung an Funktionen und Operatoren, steht uns mit XPath für diesen Zweck ein ausgezeichnetes Werkzeug zur Verfügung. Erfahrung mit dem Schreiben von XPath-Ausdrücken ist hierfür allerdings Voraussetzung.

Um ein Bild von der Vielseitigkeit und Leistungsfähigkeit von Schematron zu vermitteln, werden in den folgenden Abschnitten einige Beispiele für die Einsatzgebiete vorgestellt.