ZVON > Tutorials > XML Schema and Relax NG Tutorial
Index | >> Example 7 / 8 << | Prev | Next |
Contents > Restrictions > "Sequence" from "choice"

"Sequence" from "choice"

  1. Correct XML Schema
  2. Incorrect XML Schema - wrong occurence range
XML Schema keys: restriction, sequence, choice

1. Correct XML Schema

We 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)
The schema is correct, because: the "choice" results into one element, but the "maxOccurs" attribute of the "choice" element is 2 (total is 1x2 = 2); the "sequence" results into two elements, but the "maxOccurs" attribute of the "sequence" element is 1 (total is 2x1 = 2). And 2 is greater or equal to 2.


<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>

2. Incorrect XML Schema - wrong occurence range

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>