Der Aufbau

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

Die verschiedenen Fehler können sehr genau beschrieben werden, da der Dokumenttyp SVRL Strukturen vorsieht, die neben den eigentlichen Fehlermeldungen noch weiterführende nützliche Informationen abbilden.

Im Anhang D des ISO-Standards für Schematron ist die Struktur von SVRL in einem RELAX NG-Schema beschrieben. In allen bisherigen Beispielen haben wir das Ergebnis des letzten Transformationsprozesses in XTHML oder als unformatierten Text betrachtet. Als Erläuterung soll folgendes Beispiel dienen:

<?xml version="1.0" encoding="UTF-8"?>
<schema xmlns="http://purl.oclc.org/dsdl/schematron">
  <title>Schematron für Noah</title>
  <p>Dieses Schematron soll Noah helfen, die richtigen Tiere in der adäquaten Umgebung unterzubringen.</p>
  <ns uri="http://www.schematron.info/arche" prefix="arc"/>
  <phase id="alles">
    <active Pattern="arche"/>
    <active pattern="noah"/>
  </phase>
  <pattern id="arche">
    <rule context="arc:zimmer[arc:tier[@fleischfresser='nein']]">
      <report test="arc:tier[@fleischfresser='ja']">Es gibt Fleischfresser und Pflanzenfresser in einer Unterkunft. Die Tiere sind keine Nahrungsquelle!</report>
    </rule>
  </pattern>
  <pattern id="noah">
    <rule context="arc:tier">
      <let name="tierart" value="arc:art"/>
      <report test="count(parent::*/arc:tier[arc:art=$tierart]) &gt; 2" diagnostics="Anzahl">In dieser Unterkunft gibt es mehr als zwei Tiere dieser Art (<value-of select="arc:art"/>).</report>
      <assert test="not(count(parent::*/arc:tier[arc:art=$tierart]) &lt; 2)">In dieser Unterkunft gibt es kein Paar dieser Art (<value-of select="arc:art"/>).</assert>
    </rule>
  </pattern>
  <diagnostics>
    <diagnostic id="Anzahl">Noah, du hast <value-of select="count(parent::*/arc:tier[arc:art=$tierart])"/> Tiere von der Gattung <value-of select="arc:art"/>.</diagnostic>
  </diagnostics>
</schema>

Nachfolgend nun die SVRL-Ergebnisdatei:

<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<svrl:schematron-output xmlns:xs="http://www.w3.org/2001/XMLSchema" xmlns:sch="http://www.ascc.net/xml/schematron" xmlns:iso="http://purl.oclc.org/dsdl/schematron" xmlns:arc="http://www.schematron.info/arche" xmlns:svrl="http://purl.oclc.org/dsdl/svrl" title="Schematron für Noah" schemaVersion="">
  <svrl:text>Dieses Schematron soll Noah helfen, die richtigen Tiere in der adäquaten Umgebung unterzubringen.</svrl:text>
  <svrl:ns-prefix-in-attribute-values uri="http://www.schematron.info/arche" prefix="arc"/>
  <svrl:active-pattern id="arche" name="arche"/>
  <svrl:fired-rule context="arc:zimmer[arc:tier[@fleischfresser='nein']]"/>
  <svrl:successful-report test="arc:tier[@fleischfresser='ja']" location="/*:arche[namespace-uri()='http://www.schematron.info/arche'][1]/*:ladung[namespace-uri()='http://www.schematron.info/arche'][1]/*:zimmer[namespace-uri()='http://www.schematron.info/arche'][1]">
    <svrl:text>Es gibt Fleischfresser und Pflanzenfresser in einer Unterkunft. Die Tiere sind keine Nahrungsquelle!</svrl:text>
  </svrl:successful-report>
  <svrl:fired-rule context="arc:zimmer[arc:tier[@fleischfresser='nein']]"/>
  <svrl:active-pattern id="noah" name="noah"/>
  <svrl:fired-rule context="arc:tier"/>
  <svrl:successful-report test="count(parent::*/arc:tier[arc:art=$tierart]) &gt; 2" location="/*:arche[namespace-uri()='http://www.schematron.info/arche'][1]/*:ladung[namespace-uri()='http://www.schematron.info/arche'][1]/*:zimmer[namespace-uri()='http://www.schematron.info/arche'][1]/*:tier[namespace-uri()='http://www.schematron.info/arche'][1]">
    <svrl:text>In dieser Unterkunft gibt es mehr als zwei Tiere dieser Art (Zebra). <svrl:diagnostic-reference diagnostic="Anzahl" id="Anzahl">Noah, du hast 3 Tiere von der Gattung Zebra.</svrl:diagnostic-reference></svrl:text>
  </svrl:successful-report>
  …
  <svrl:fired-rule context="arc:tier"/>
  <svrl:fired-rule context="arc:tier"/>
</svrl:schematron-output>

Das Wurzelelement eines SVRL-Dokumentes heißt <svrl:schematron-output>. Es gibt drei Attribute, die hier verwendet werden können. Das Attribut title kann den Text des Schematron-Elementes <title> enthalten. Das Attribut phase wurde bislang noch nicht genauer in seiner Verwendung spezifiziert, dürfte aber den Namen der verwendeten <phase> enthalten. Das Attribut schemaVersion übernimmt den Wert des gleichnamigen Attributes des Schematron-Wurzelelementes <schema>.

Weiter gibt es die optionalen Elemente <svrl:text> und <svrl:ns-prefix-in-attribute-values>. <svrl:text> enthält den Inhalt von <p>; <svrl:ns-prefix-in-attribute-values> entspricht dem Schematron-Element <ns>.

So wird aus

<ns uri="http://www.schematron.info/arche" prefix="arc"/>

in SVRL

<svrl:ns-prefix-in-attribute-values uri="http://www.schematron.info/arche" prefix="arc"/>

Das Element <svrl:active-pattern> gibt an, welche der Patterns in dieser Phase aktiv sind.

Hierfür wird das Element <active> ausgewertet. Die beiden Attribute id und name werden mit dem Wert des pattern-Attributes von <active> befüllt. Alle darauf folgenden Elemente <svrl:fired-rule> bis zum nächsten Auftreten von <svrl:active-pattern> gehören zu dieser Gruppierung. Wenn kein <active> verwendet wurde, wird <svrl:active-pattern> ohne Attribute ausgegeben, da es sich um ein Pflichtelement handelt.

Das zentrale Element <svrl:fired-rule> wird jedes Mal, wenn eine Regel zutrifft, ausgegeben. Bei unserer Arche also z.B. immer dann, wenn das context-Attribut des Elementes <rule> zutrifft.

<rule context="arc:zimmer[arc:tier[@fleischfresser='nein']]">

Das <svrl:fired-rule> besitzt ebenfalls ein context-Attribut, in das der Inhalt des <rule>-context-Attributes kopiert wird, wie folgender Ausdruck zeigt:

<svrl:fired-rule context="arc:zimmer[arc:tier[@fleischfresser='nein']]"/>

Die Elemente <svrl:failed-assert> und <svrl:successful-report> werden immer dann erzeugt, wenn das Element <assert> bzw. <report> aktiv wird. Beide besitzen ein Attribut test, das den XPath-Ausdruck (je nach Verwendung von <assert> oder <report>) anzeigt, also den Inhalt der test-Attribute kopiert. Das Attribut location wird mit der genauen Position der Zusicherung bzw. der Fehlermeldung befüllt. Sinnvollerweise wird dies mit einem absoluten XPath-Ausdruck sichergestellt.

Dazu ein Beispiel:

<svrl:successful-report test="arc:tier[@fleischfresser='ja']" location="/*:arche[namespace-uri()='http://www.schematron.info/arche'][1]/*:ladung[namespace-uri()='http://www.schematron.info/arche'][1]/*:zimmer[namespace-uri()='http://www.schematron.info/arche'][1]">

Innerhalb von <svrl:failed-assert> und <svrl:successful-report> werden die beschreibenden Texte, die ursprünglich von <assert> oder <report> stammen, in einem <svrl:text> ausgegeben.

<svrl:failed-assert test="not(count(parent::*/arc:tier[arc:art=$tierart]) &lt; 2)" location="/*:arche[namespace-uri()='http://www.schematron.info/arche'][1]/*:ladung[namespace-uri()='http://www.schematron.info/arche'][1]/*:zimmer[namespace-uri()='http://www.schematron.info/arche'][1]/*:tier[namespace-uri()='http://www.schematron.info/arche'][4]">
  <svrl:text>In dieser Unterkunft gibt es kein Paar dieser Art (Zebra).</svrl:text>
</svrl:failed-assert>

Das Element <svrl:diagnostic-reference> enthält den Inhalt von <diagnostic>, das in Schematron über eine ID referenziert wurde.

Hier ein Beispiel:

<svrl:diagnostic-reference diagnostic="Anzahl" id="Anzahl">Noah, du hast 3 Tiere von der Gattung Zebra.</svrl:diagnostic-reference>

Da dieser Inhalt abhängig von <assert> oder <report> ist, wird hier der Text angezeigt und eventuell vorhandene <value-of>-Elemente werden aufgelöst.

   

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