Assertions on simple types

XSD 1.1 allows assertions on simple types to be defined. The mechanism is to define an xs:assertion element as a child of the xs:restriction child of the xs:simpleType element (that is, it acts as an additional facet). The type must be an atomic type. The value of the test attribute of xs:assert is an XPath expression.

The expression is evaluated with the value being validated supplied as the value of the variable $value. This will be an instance of the base type: for example, if you are restricting from xs:string, it will be a string; if you are restricting from xs:date, it will be an xs:date; if you are validating a list of integers, then $value will be a sequence of integers.

If the effective boolean value of the expression is true, the value is valid. If the effective boolean value is false, or if a dynamic error occurs while evaluating the expression, the value is invalid. Currently no diagnostics are produced to indicate why the value is deemed invalid, other than a statement that the xs:assertion facet is violated. You can supply a message in a saxon:message attribute: see saxon:message.

The XPath expression has no access to any part of the document being validated, other than the atomic value of the actual element or attribute node. So the validation cannot be context-sensitive.

The XPath expression may make calls on Java extension functions in the normal way: see Writing extension functions in Java. Allowing call-out to procedural programming languages means that you can perform arbitrary procedural validation of element and attribute values. Take care to disable use of extension functions if validating against a schema that is untrusted.

The following example validates that a date is in the past:

<xs:element name="date"> <xs:simpleType> <xs:restriction base="xs:date"> <xs:assertion test="$value lt current-date()"/> </xs:restriction> </xs:simpleType> </xs:element>

The following example validates that a string is a legal XPath expression. This relies on the fact that a failure evaluating the assertion is treated as "false":

<xs:element name="xpath"> <xs:simpleType> <xs:restriction base="xs:string"> <xs:assertion test="exists(saxon:expression($value))" xmlns:saxon="http://saxon.sf.net/"/> </xs:restriction> </xs:simpleType> </xs:element>

Note how the in-scope namespaces for the XPath expression are taken from the in-scope namespaces of the containing xs:assert element.