So here goes this example.
XML document:
<?xml version="1.0" encoding="UTF-8" ?>
<product id="100">
<shortname>Sun Press, Java Book</shortname>
<description>Java Language: Design and Programming</description>
<author>James Gosling</author>
<price>
<value effective="2000-10-10" format="hard cover">25</value>
<value effective="2005-10-10" format="hard cover">20</value>
<value effective="2009-10-10" format="pdf" freeware="true">0</value>
</price>
</product>
An XSD 1.1 schema validating the above XML document: <?xml version="1.0" encoding="UTF-8" ?>
<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema">
<xs:complexType name="Product">
<xs:sequence>
<xs:element name="shortName">
<xs:simpleType>
<xs:restriction base="xs:string">
<xs:maxLength value="20"/>
</xs:restriction>
</xs:simpleType>
</xs:element>
<xs:element name="description" type="xs:string"/>
<xs:element name="author" type="xs:string"/>
<xs:element name="price">
<xs:complexType>
<xs:sequence>
<xs:element name="value" maxOccurs="unbounded">
<xs:complexType>
<xs:simpleContent>
<xs:extension base="xs:double">
<xs:attribute name="effective" type="xs:date" use="required"/>
<xs:attribute name="freeware" type="xs:boolean"/>
<xs:attribute name="format" use="required">
<xs:simpleType>
<xs:restriction base="xs:string">
<xs:enumeration value="hard cover"/>
<xs:enumeration value="pdf"/>
</xs:restriction>
</xs:simpleType>
</xs:attribute>
<xs:assert test="@effective lt current-date()" />
<xs:assert test="if (@freeware eq true()) then (@format eq 'pdf' and . eq 0)
else true()" />
</xs:extension>
</xs:simpleContent>
</xs:complexType>
</xs:element>
</xs:sequence>
<xs:assert test="every $vl in value[position() lt last()] satisfies
($vl gt $vl/following-sibling::value[1]) and
($vl/@effective lt $vl/following-sibling::value[1]/@effective)" />
</xs:complexType>
</xs:element>
</xs:sequence>
<xs:attribute name="ID" type="xs:positiveInteger" use="required"/>
</xs:complexType>
<xs:element name="product" type="Product"/>
</xs:schema>
I don't wish to explain in detail the problem domain behind the above XML & XSD documents (I believe, readers familiar with XSD language & XML could easily understand the intent of the above example). In very shortest description, this example "illustrates a simple product catalog, describing a single product".
Here's a short explanation, about what the assertions -- highlighted with a different color (starting from assertion at top, to assertion at bottom) in above schema document are, intending to do:
1. The first assertion is checking, that the value of attribute "effective" (with a schema type, xs:date) is prior to today's date.
2. The second assertion is checking, that if value of attribute "freeware" is a boolean 'true', then value of attribute "format" must be 'pdf' & the numeric value of price should be 0.
3. The third assertion is checking, that price always reduces in future, & the effective date of the price is prior to the next price revision.
I enjoyed writing this example, and I'm glad that this worked with Xerces. The Eclipse/PsychoPath XPath 2.0 implementation (which is the underlying XPath 2 implementation, used by Xerces-J XSD 1.1 assertions implementation) also looks pretty compliant to the XPath 2 language.
I hope, that this post is useful.
2 comments:
Great to see that PsychoPath is working well. Any update on when there will be an official Xerces-J 2.10 release?
I'm not aware about the exact date. It seems Xerces committers responsible for release, are still somewhat busy. But I'm expecting the 2.10.0 release sometime soon :)
Post a Comment