XML-Know How

Die Syntax

Jedes Schematron-Schema ist selbst eine XML-Datei. Anders als zum Beispiel bei der DTD müssen wir also keine neue Syntax erlernen, sondern bewegen uns ausschließlich in dem uns bekannten Datenmodell. Als Adressierungssprache zum Formulieren der Businessrules wird XPath verwendet. Eine Einführung in diese Technologie gibt der Artikel II.A.6. Wenn man über dieses Grundwissen verfügt, ist es nur noch ein kleiner Schritt bis zum ersten selbst geschriebenen Schematron-Schema. Bereits mit nur fünf Elementen und einer Handvoll Attribute lassen sich komplexe Businessrules aufstellen.

Das Sprachdesign führt dazu, dass die Schemata sehr leicht von Anwendungen verarbeitet werden können; so leicht, dass man fast ohne Programmierkenntnisse eigene Anwendungen dafür entwickeln kann.

Als XML-Dokument verfügt jedes Schematron-Schema über eine XML-Deklaration und ein Wurzelelement:

<?xml version="1.0" encoding="UTF-8"?>
<sch:schema xmlns:sch="http://purl.oclc.org/dsdl/schematron">
...
</sch:schema>

Das Wurzelelement <sch:schema> deklariert das Dokument als ein Schematron-Schema. Es trägt weiterhin ein Attribut, durch das die Assoziation mit einem Namensraum erfolgt und die Verknüpfung mit dem Präfix „sch“ hergestellt wird. Dieses Präfix wird mit einem Doppelpunkt abgetrennt vor jeden Elementnamen des Schemas geschrieben. Der Sinn von solchen Namensräumen ist es, Namenskollisionen zu vermeiden, wenn Strukturen unterschiedlicher Dokumenttypen aufeinander treffen[1].

Um die verschiedenen Businessrules des Schemas zu gruppieren, wird das <sch:pattern>-Element verwendet:

<?xml version="1.0" encoding="UTF-8"?>
<sch:schemaxmlns:sch="http://purl.oclc.org/dsdl/schematron">
       <sch:pattern>
         …
       </sch:pattern>

</sch:schema>

Diese Gruppierung spielt eine wichtige Rolle in dem internen Algorithmus, mit dem das Schema beim Validieren abgearbeitet wird.

Nun folgt das <sch:rule>-Element, das den eigentlichen Grundbaustein des Schemas darstellt. Es dient als Container für alle Tests, die benötigt werden, um eine Businessrule zu beschreiben:

<?xml version="1.0"encoding="UTF-8"?>
<sch:schemaxmlns:sch="http://purl.oclc.org/dsdl/schematron">
      <sch:pattern>
       <sch:rulecontext="XPath-Ausdruck">
           …
       </sch:rule>

    </sch:pattern>
</sch:schema>

Der XPath-Ausdruck ist ein Lokalisierungspfad zum Adressieren der Knoten oder des Knotensets, für welche die Regel gelten soll. Diese Konstruktion erinnert stark an die Templates der Transformations- und Formatierungssprache XSLT[2]. Das ist kein Zufall, denn die Idee für den Ansatz einer kontextbasierten Validierung entstand bei der Arbeit mit XSLT. Es lassen sich noch viele weitere Gemeinsamkeiten zwischen den beiden Technologien erkennen.

Mit Hilfe der <sch:assert>- und <sch:report>-Elemente werden nun die eigentlichen Tests formuliert, auf die der Kontextknoten überprüft werden soll. Die <sch:assert>-Elemente formulieren dabei eine Zusicherung in Form einer positiven Bedingung, welche von den Instanzen des Dokumenttyps eingehalten werden soll. Das <sch:report>-Element formuliert dagegen einen Fehlerzustand in Form einer negativen Bedingung, welcher für die Instanzen eines Dokumenttyps verboten sein soll.

<?xml version="1.0" encoding="UTF-8"?>
<sch:schemaxmlns:sch="http://purl.oclc.org/dsdl/schematron">
    <sch:pattern>
       <sch:rule context="XPath-Ausdruck">
          <sch:assert test"boolescher Ausdruck">
               Freiformulierbare Fehlermeldung
           </sch:assert>
           <sch:report test"boolescherAusdruck">
               Freiformulierbare Fehlermeldung
           </sch:report>

       </sch:rule>
</sch:pattern>
</sch:schema>

Die Zusicherungen und Fehlerzustände werden in Form von booleschen Ausdrücken formuliert, indem über das test-Attribut XPath-Ausdrücke auf den Kontextknoten angewendet werden. Adressiert ein Knotentest zumindest einen Knoten oder sogar ein Knotenset, erfolgt eine Umwandlung in den
booleschen Rückgabewert „true“, anderenfalls wird der Wert „false“ zurück gegeben. Bei der Validierung übergibt ein <sch:report>-Element seine Fehlermeldung an ein Ausgabeprotokoll, wenn der Knotentest „true“ ergibt. Ein <sch:assert>-Element übergibt dagegen seinen Ausgabebereich, wenn der Knotentest „false“ ergibt. Auch diese Konstruktion gibt es analog in XSLT[3], wo sie als „bedingte Verarbeitung“ bekannt ist.

Neben dem test-Attribut enthalten die <sch:assert>- und <sch:report>-Elemente auch Text, der als Fehlermeldung ausgegeben werden kann, wenn die Regel verletzt wird. Das ist ein großer Vorteil gegenüber anderen Validierungssprachen, bei denen die Fehlermeldungen von einem Prozessor generiert werden. Solche automatisch erzeugten Hinweise können besonders für einen Laien sehr verwirrend sein, weil sie nahezu kryptische Formulierungen enthalten können. Mit Schematron ist es dagegen möglich, dem Anwender konkrete, auf das vorliegende Projekt zugeschnittene Handlungsanweisungen zu geben, wie der Fehler zu beheben ist.


     

  1. ↑  Vgl. hierzu den Artikel über XML-Schema
  2. ↑  Vgl. hierzu den Artikel über XSLT
  3. ↑  Vgl. hierzu den Artikel über XSLT
  4.