Mithilfe der Elemente und werden die eigentlichen Tests formuliert, mit denen die zuvor ausgewählten Knoten überprüft werden sollen. Ein -Element beschreibt eine Zusicherung in Form einer positiven Bedingung, die von den ausgewählten Knoten eingehalten werden soll. Das -Element beschreibt dagegen einen Fehlerzustand in Form einer negativen Bedingung. Die Zusicherungen und Fehlerzustände werden in Form von booleschen Ausdrücken formuliert, indem über das Attribut test ein XPath-Ausdruck auf den Kontextknoten angewendet wird. Adressiert ein Knotentest mindestens einen Knoten, erfolgt gemäß XPATH eine Typkonvertierung in den booleschen Rückgabewert true, anderenfalls wird der Wert false zurückgegeben.
Neben dem Attribut test können die Elemente und auch Text enthalten, der im Fall eines Fehlers als Meldung ausgegeben wird. Dies ist ein entscheidender Vorteil gegenüber anderen Validierungssprachen, bei denen die Fehlermeldungen vom validierenden Parser generiert werden. Automatisch erzeugte Hinweise können besonders für einen Laien sehr verwirrend sein, weil sie oft unverständliche Formulierungen enthalten. Mit Schematron ist es dagegen möglich, dem Anwender konkrete, auf das vorliegende Problem zugeschnittene Handlungsanweisungen zu geben. Mit diesen fünf Elementen sind wir nun in der Lage, die eingangs eingeführte Problemstellung der Fußnotenverschachtelung mit einem einfachen Schematron-Schema zu lösen:
<?xml version="1.0" encoding="UTF-8"?><sch:schema xmlns:sch="http://purl.oclc.org/dsdl/schematron"><sch:pattern name="Rekursionen">(1) <sch:rule context="footnote">(2) <sch:report test=".//footnote">Geschachtelte Fußnoten sind nicht erlaubt.</sch:report></sch:rule></sch:pattern></sch:schema>
Der erste Ausdruck (1) legt den Kontextknoten auf alle footnote-Elemente. Der zweite Ausdruck (2) testet den Kontextknoten und gibt je nach Testergebnis einen booleschen Wahrheitswert zurück. Der Knotentest .//footnote überprüft demnach, ob innerhalb eines footnote-Elements weitere footnote-Elemente existieren. Da der Ausdruck in einem -Element steht, wird die Fehlermeldung dann ausgegeben, wenn der boolesche Ausdruck den Wert true zurückgibt.
Weitere Beispiele
Die Einsatzgebiete von Schematron sind nicht auf Anwendungen aus dem Bereich der Dokumenterstellung beschränkt. Auch XML-Anwendungen aus dem Bereich der datenzentrierten Dokumenttypen bieten reichhaltige Einsatzmöglichkeiten. Im folgenden Angebotsschema werden mehrere Produkte mit Anzahl und Einzelpreis aufgelistet:
<?xml version="1.0" encoding="UTF-8"?><angebot><produkte><produkt><produktId>PRO000001</produktId><name>Toner 01 Schwarz</name><anzahl>2</anzahl><preis>46.00</preis></produkt><produkt><produktId>PRO000002</produktId><name>Toner 01 Gelb</name><anzahl>1</anzahl><preis>43.33</preis></produkt><produkt><produktId>PRO000003</produktId><name>Toner 01 Cyan</name><anzahl>5</anzahl><preis>48.00</preis></produkt><produkt><produktId>PRO000004</produktId><name>Toner 02 Schwarz</name><anzahl>2</anzahl><preis>28.33</preis></produkt></produkte><gesamtpreis>431.98</gesamtpreis></angebot>
In diesem extrem vereinfachten Angebotsszenario gibt es mehrere potenzielle Fehlerquellen. Ein mögliches Problemfeld kann die korrekte Berechnung der Preise sein. Eine mögliche Regel wäre: Das Element
<?xml version="1.0" encoding="UTF-8"?><schema xmlns="http://purl.oclc.org/dsdl/schematron" queryBinding="xslt2"><pattern><rule context="angebot"><assert test="sum(for $item in produkte/produktreturn $item/anzahl * $item/preis) = gesamtpreis">Korrekter Gesamtpreis:<value-of select="sum(for $item in produkte/produkt return $item/anzahl * $item/preis)"/></assert></rule></pattern></schema>
Durch die Möglichkeit, mit XPath 2.0 for-Schleifen zu formulieren, lässt sich in einem Ausdruck die Summe aller Einzelpositionen ermitteln und mit dem Gesamtpreis vergleichen. Sollte wie im obigen Beispiel die Gesamtsumme nicht mit den Summen der Einzelpositionen übereinstimmen, kann mithilfe des Ausdrucks





