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