ZVON > Tutorials > XML Schema and Relax NG Tutorial |
Intro / Search / ZVON |
Index | >> Example 7 / 8 << | Prev | Next | |
Please, send all comments, bug-reports, and contributions to Jiri.Jirat@systinet.com. Thank you very much.
XML Schema keys: restriction, sequence, choiceWe can "change" the "choice" type to "sequence". However, we must satisfy the conditions for occurrence range. Roughly, the length of the original type must be greater than of the derived one. Schema Component Constraint: Particle Derivation OK (Sequence:Choice - MapAndSum)
Valid document <root xsi:noNamespaceSchemaLocation="correct_0.xsd" xmlns="" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" > <x>1</x> <y>1</y> </root> |
Correct XML Schema (correct_0.xsd) <xsd:schema xmlns:xsd="http://www.w3.org/2001/XMLSchema" > <xsd:element name="root" type="BBB"/> <xsd:complexType name="AAA"> <xsd:choice maxOccurs="2"> <xsd:element name="x" type="xsd:string" minOccurs="1" maxOccurs="1"/> <xsd:element name="y" type="xsd:string" minOccurs="1" maxOccurs="1"/> </xsd:choice> </xsd:complexType> <xsd:complexType name="BBB"> <xsd:complexContent> <xsd:restriction base="AAA"> <xsd:sequence maxOccurs="1"> <xsd:element name="x" type="xsd:string" minOccurs="1" maxOccurs="1"/> <xsd:element name="y" type="xsd:string" minOccurs="1" maxOccurs="1"/> </xsd:sequence> </xsd:restriction> </xsd:complexContent> </xsd:complexType> </xsd:schema> |
The schema is not correct, because: the "choice" results into one element, the "maxOccurs" attribute of the "choice" element is 1 (total is 1x1 = 1); the "sequence" results into two elements, the "maxOccurs" attribute of the "sequence" element is 1 (total is 2x1 = 2). And 1 is not greater or equal to 2. In other words, the restricted type is "longer" than the original and that is not allowed. I hope my explanation is OK ...
Incorrect XML Schema (incorrect_0.xsd) <xsd:schema xmlns:xsd="http://www.w3.org/2001/XMLSchema" > <xsd:element name="root" type="BBB"/> <xsd:complexType name="AAA"> <xsd:choice maxOccurs="1"> <xsd:element name="x" type="xsd:string" minOccurs="1" maxOccurs="1"/> <xsd:element name="y" type="xsd:string" minOccurs="1" maxOccurs="1"/> </xsd:choice> </xsd:complexType> <xsd:complexType name="BBB"> <xsd:complexContent> <xsd:restriction base="AAA"> <xsd:sequence maxOccurs="1"> <xsd:element name="x" type="xsd:string" minOccurs="1" maxOccurs="1"/> <xsd:element name="y" type="xsd:string" minOccurs="1" maxOccurs="1"/> </xsd:sequence> </xsd:restriction> </xsd:complexContent> </xsd:complexType> </xsd:schema> |