XSD Tutorials - Herong's Tutorial Examples - v5.23, by Herong Yang
Constraining Facets on List Datatypes
This section describes fundamental and constraining facets on list datatypes: 'length', 'minLength', 'maxLength', 'pattern', 'enumeration' and 'assertions'. New simple datatype can be defined with a 'restriction' component using a list datatype as the base.
From the previous tutorial, we know that a list datatype is defined as a datatype where the entire lexical representation is mapped to a list of items separated by whitespaces. And its item datatype is another atomic datatype or atomic union datatype. Now let's see what facets are supported on list datatypes.
A list construction supports 2 groups of facets: fundamental facets and constraining facets:
A list datatype has the following settings for its fundamental facets defined:
ordered = false bounded = false cardinality = countably infinite numeric = false
A list datatype supports the following constraining facets:
whiteSpace = collapse length = undefined minLength = 1 maxLength = undefined pattern = undefined enumeration = undefined assertions = undefined
That means we can define a new simple datatype with a "restriction" construction component using a list datatype as the base. Some notes on how constraining facets are applied on list values:
For example, the following XSD document uses "restriction" components on list datatypes to define 2 new simple datatypes:
<?xml version="1.1"?> <!-- list_facet_test.xsd - Copyright (c) 2002-2013 HerongYang.com. All Rights Reserved. --> <xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema"> <xs:simpleType name="strList"> <xs:list itemType="xs:string"/> </xs:simpleType> <xs:simpleType name="intList"> <xs:list> <xs:simpleType> <xs:restriction base="xs:unsignedByte"> <xs:minInclusive value="1"/> <xs:maxInclusive value="49"/> </xs:restriction> </xs:simpleType> </xs:list> </xs:simpleType> <xs:element name="List_Facet_Test"> <xs:complexType> <xs:sequence> <xs:element name="Winners" maxOccurs="unbounded"> <!-- "restriction" on "list" datatype --> <xs:simpleType> <xs:restriction base="strList"> <xs:length value="3"/> <xs:pattern value="\w{6} \w{5} \w{4}"/> </xs:restriction> </xs:simpleType> </xs:element> <xs:element name="WinningNumbers" maxOccurs="unbounded"> <!-- "restriction" on "list" datatype --> <xs:simpleType> <xs:restriction base="intList"> <xs:length value="6"/> </xs:restriction> </xs:simpleType> </xs:element> </xs:sequence> </xs:complexType> </xs:element> </xs:schema>
Here is a sample XML document to test the above XSD document:
<?xml version="1.1"?> <!-- list_facet_test.xml - Copyright (c) 2002-2013 HerongYang.com. All Rights Reserved. --> <List_Facet_Test> <!-- Valid "Winners" list of 3 items --> <Winners> Herong Maria Bill </Winners> <!-- Invalid "Winners" values --> <Winners> Lee Maria Bill </Winners> <Winners> <![CDATA[B. Lee]]> Maria Bill </Winners> <!-- Valid "WinningNumbers" list values --> <WinningNumbers> 1 20 24 33 37 43 </WinningNumbers> <!-- Invalid "WinningNumbers" values --> <WinningNumbers> 1 20 24 33 37 43 49 </WinningNumbers> </List_Facet_Test>
When validating this XML document with my XsdSchemaValidator.java program presented earlier in the book, I get these errors:
herong> java XsdSchemaValidator ^^^ list_facet_test.xsd list_facet_test.xml Error: Line number: 11 Column number: 47 Message: cvc-pattern-valid: Value 'Lee Maria Bill' is not facet- valid with respect to pattern '\w{6} \w{5} \w{4}' for type '#AnonType_WinnersList_Facet_Test'. (6 characters are needed on the first item) Error: Line number: 11 Column number: 47 Message: cvc-type.3.1.3: The value 'Lee Maria Bill' of element 'Winners' is not valid. Error: Line number: 12 Column number: 55 Message: cvc-pattern-valid: Value 'B. Lee Maria Bill' is not facet- valid with respect to pattern '\w{6} \w{5} \w{4}' for type '#AnonType_WinnersList_Facet_Test'. (CDATA block is not able to "glue" togeter "B. Lee" as 1 item) Error: Line number: 12 Column number: 55 Message: cvc-type.3.1.3: The value 'B. Lee Maria Bill' of element 'Winners' is not valid. Error: Line number: 18 Column number: 63 Message: cvc-length-valid: Value '1 20 24 33 37 43 49' with length = '7' is not facet-valid with respect to length '6' for type '#AnonType_WinningNumbersList_Facet_Test'. (only 6 items are allowed) Error: Line number: 18 Column number: 63 Message: cvc-type.3.1.3: The value '1 20 24 33 37 43 49' of element 'WinningNumbers' is not valid. Failed with errors: 6
Table of Contents
XML Editor and Schema Processor - XMLPad
Java API for XML Processing - JAXP
JAXP - XML Schema (XSD) Validation
Xerces2 Java Parser - Java API of XML Parsers
Introduction of XSD Built-in Datatypes
"string" and Its Derived Datatypes
"decimal" and Its Derived Datatypes
"dateTime" and Its Related Datatypes
Miscellaneous Built-in Datatypes
Facets, Constraining Facets and Restriction Datatypes
►"simpleType" - Defining Your Own Simple Datatypes
"simpleType" Components - User-Defined Simple Datatypes
"simpleType" Components with "restriction" Child Components
"simpleType" Components with "union" Child Components
"simpleType" Components with "list" Child Components
Atomic, List, Atomic Union and List Union Datatypes
►Constraining Facets on List Datatypes
Constraining Facets on Union Datatypes
Nested List Datatypes - Not Allowed
Nested Atomic and List Union Datatypes
Identity-Constraints: unique, key and keyref
Assertion as Custom Validation Rules
XML Schema Location and Namespace in XML Documents
Overriding Element Types in XML Documents