TOP

XML Schema Assertions

Heute habe ich ein wirklich cooles Feature von XML Schema 1.1 entdeckt von dem ich bisher noch nie was gehört oder gesehen hatte. Bei der Definition von XML-Schemas bin ich schon öfters an einen Punkt gestoßen, an dem man ein Constraint für einen komplexen Datentype gerne in einem Schema unterbringen möchte, XML Schema 1.0 jedoch nicht die sprachlichen Mittel bereitstellt. Ein Beispiel für ein solches Constraint wäre:
Attribut X muss den Wert "Foobar" einnehmen, wenn Attribut Y im Wertebereich >= 20 und <= 50 liegt.

Gelöst wird dies meist entweder in dem man das Constraint in ausführbaren Code gießt oder man zusätzlich mittels einem XSLT/XPath oder Schematron Dokument validiert. Dies hat jedoch den Nachteil, dass man ein zweites Dokument erstellen muss, dass dann auch immer synchron gehalten werden müssen.

Wie ich heute gelernt habe gibt es seit XML Schema 1.1. eine Lösung für dieses Problem, das assert-Tag. Man kann mittels diesem Tags ein Constraint direkt auf einem komplexen Datentyp definieren. Hierzu benutzt man das test-Attribut. Es beinhaltet einen nach Boolean evaluierenden XPath Ausdruck. Nur wenn sowohl das Schema valide ist als auch alle Constraints nach True evaluieren, ist das Dokument valide. Um möglichst nützliche Fehlermeldungen bei einem nach False evaluierten Constraint zu erzeugen kann man z. B. das assert-Tag um das message-Attribut aus dem Xerces-Namespace anreichern.

Folgendes ungetestete Beispiel zeigt ein Schema für oben genanntes Beispiel mit passender Fehlermeldung. Wie man am Beispiel sieht wird die Evaluierung auf Basis des Eltern-Elements realisiert.

<?xml version="1.0" encoding="UTF-8"?>
<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema"
   xmlns:xerces="http://xerces.apache.org">
 <xs:element name="example">
  <xs:complexType>
   <xs:attribute name="X" type="xs:string" />
   <xs:attribute name="Y" type="xs:int" />
   <xs:assert test="@X eq 'Foobar' and @Y >= 20 and @Y <= 50"
     xerces:message="X muss den Wert 'Foobar' einnehmen, wenn ..." />
  </xs:complexType>
 </xs:element>
</xs:schema>
Links
Hinweis

Aktuell befindet sich die Spezifikation zu XML Schema 1.1 noch im Status „Last Call Working Draft“. Es ist also sehr wahrscheinlich, dass die Spezifikation ohne große nennenswerte Änderungen als Standard übernommen wird. Der aktuell Status kann man auf der W3 Seite erfahren.

Read More