Das Business Rule-Prinzip

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

Das Business Rule-Prinzip hat seinen Ursprung nicht in Schematron. Ein Schematron-Schema ist nur geeignet dafür, Business Rules technisch zu formulieren, sodass XML-Dokumente anhand dieser Business Rules überprüft werden können. Eine Business Rule ist jede mögliche Bedingung, die wir an ein XML-Dokument stellen können. Eine ausformulierte Business Rule für die Arche-Instanz lautet beispielsweise:

  • Fleischfressende Tiere dürfen nicht mit pflanzenfressenden Tieren in einer Unterkunft untergebracht sein.

Schematron verwendet Regeln (<rule>-Elemente), die auch mehrere Business Rules zusammenfassen können. Ebenso kann es aber auch sein, dass mehrere Schematron-Regeln benötigt werden, um eine einzige Business Rule zu beschreiben. Eine Schematron-Regel beschreibt abhängig von einem Kontext bestimmte Kriterien, nach denen das Dokument zu prüfen ist.

Bei der Festlegung des Kontextknotens muss es sich nicht zwangsläufig um einen einzelnen Knoten handeln; es kann auch eine Knotenmenge (z. B. alle Elemente mit einem bestimmten Namen) umfassen. Die zu überprüfenden Kriterien werden durch sogenannte Tests definiert, die einer Regel zugeordnet werden. Schlägt ein Test fehl, so wird eine vorher festgelegte Fehlermeldung ausgegeben. Die Kontextknoten der oben genannten Regel wären demnach alle fleischfressenden Tiere der Arche-Instanz. Das abzufragende Kriterium lautet dann, dass diese Tiere mit keinem pflanzenfressenden Tier im gleichen Zimmer untergebracht sein dürfen. Die folgenden Variationen der Business Rule sollen zeigen, dass auch Schematron-Regeln mit unterschiedlichen Kontextknoten die gleiche Business Rule beschreiben können:

  • Pflanzenfressende Tiere dürfen nicht mit fleischfressenden Tieren in einer Unterkunft untergebracht sein.
  • Zimmer dürfen entweder nur pflanzenfressende oder nur fleischfressende Tiere beherbergen.

Die entsprechenden Regeln hätten nun einen anderen Kontextknoten, nämlich pflanzenfressende Tiere bzw. Zimmer. Daraus folgt dann eine andere Formulierung der entsprechenden Tests.

Wie definiere ich eine Business Rule?

So viel zur Theorie. Die Umsetzung von Business Rules in Schematron ist nun nicht mehr allzu schwer. Das Element <rule> beinhaltet die Regel; das Attribut context legt den Kontextknoten fest. Das <rule>-Element enthält dann noch die Tests bzw. Bedingungen, die der Regel zugeordnet werden sollen.

<schema xmlns="http://purl.oclc.org/dsdl/schematron">
  <ns uri="http://www.schematron.info/arche" prefix="arc"/>
  <Pattern>
    <rule context="arc:tier[@fleischfresser='ja']">   (1)
      <report test="parent::*/arc:tier[@fleischfresser='nein']">Es gibt Fleischfresser und Pflanzenfresser in einer Unterkunft. Die Tiere sind keine Nahrungsquelle!</report>
    </rule>
  </pattern>
</schema>

(1) Die Regel wird auf alle <tier>-Elemente der Instanz angewandt, deren fleischfresser-Attribute den Wert ja haben. Die Anwendung einer Regel auf ein Element bedeutet, dass für das Element alle Tests, die in dieser Regel definiert wurden, überprüft werden.

 

Anmerkung für XSLT-Kenner:
Das Business Rule-Prinzip entspricht dem gleichen Prinzip wie dem von XSLT-Templates mit dem Attribut match. Bei einer Implementierung zur Transformation von Schematron zu XSLT werden intern alle Regeln in Templates umgesetzt und die entsprechenden Werte der context-Attribute als match-Attribute übernommen. Die Transformation des genannten Beispiels ergibt also:

<xsl:template match="arc:tier[@fleischfresser='ja']">
     […]
     <!-- Die Tests werden als xsl:if-Elemente umgesetzt -->
     […]
</xsl:template>

 

Die Auswahl des Kontextknotens kann durch einen XPath-Ausdruck auch Bedingungen in Form von Prädikaten enthalten. Im obigen Beispiel soll überprüft werden, ob ein fleischfressendes Tier mit einem Pflanzenfresser in einem Zimmer untergekommen ist. Diese Bedingung könnte nun anhand von zusätzlichen Prädikaten erweitert werden. Beispielsweise kann geprüft werden, ob ein männlicher Fleischfresser und ein Pflanzenfresser in einem Zimmer wohnen (unter der — politisch und biologisch inkorrekten — Annahme, ein männliches Tier sei das stärkere).

<schema xmlns="http://purl.oclc.org/dsdl/schematron">
  <ns uri="http://www.schematron.info/arche" prefix="arc"/>
  <pattern>
    <rule context="arc:tier[@fleischfresser='ja'][@geschlecht='männlich']">   (1)
      <report test="parent::*/arc:tier[@fleischfresser='nein']">Es gibt Fleischfresser und Pflanzenfresser in einer Unterkunft. Die Tiere sind keine Nahrungsquelle!</report>
    </rule>
  </pattern>
</schema>

(1) Der XPath-Ausdruck im context-Attribut wurde hier um ein weiteres Prädikat ergänzt. Nun wird die Regel nur noch auf Tiere angewandt, die fleischfressend und männlich sind. Das heißt, ein Test muss nur noch überprüfen, ob ein pflanzenfressendes Tier im gleichen Zimmer wohnt.

Diese Art der Vorauswahl ist jedoch nicht zwingend notwendig. Die gleichen Kriterien könnten auch bei einem Test abgefragt werden. Da das context-Attribut allerdings bestimmt, auf welche Knoten die Regel angewandt wird, kann eine Vorauswahl die Anzahl der zu durchlaufenden Regeln erheblich minimieren, was die Performance des Prüfprozesses positiv beeinflusst. Zudem vereinfacht es die XPath-Ausdrücke der darauf folgenden Tests.

   

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