ZVON > Tutorials > XML Schema and Relax NG Tutorial
Index | >> Example 7 / 9 << | Prev | Next |
Contents > Simple tasks > Element which contains one of two elements

Element which contains one of two elements

  1. XML Schema
  2. Relax NG

Please, send all comments, bug-reports, and contributions to Jiri.Jirat@systinet.com. Thank you very much.

XML Schema keys: choice
Relax NG keys: choice

1. XML Schema

We want to have the root element to be named "AAA", from null namespace and contains either "BBB" or "CCC" elements (but not both). Use the "choice" element.

Valid document


<AAA xsi:noNamespaceSchemaLocation="correct_0.xsd" xmlns="" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" >
  <BBB>111</BBB>
</AAA>

Valid document


<AAA xsi:noNamespaceSchemaLocation="correct_0.xsd" xmlns="" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" >
  <CCC>aaa</CCC>
</AAA>

Invalid document


<AAA xsi:noNamespaceSchemaLocation="correct_0.xsd" xmlns="" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" />

Invalid document


<AAA xsi:noNamespaceSchemaLocation="correct_0.xsd" xmlns="" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" >
  <BBB>111</BBB>
  <CCC>aaa</CCC>
</AAA>

Correct XML Schema (correct_0.xsd)


<xsd:schema xmlns:xsd="http://www.w3.org/2001/XMLSchema" >

  <xsd:element name="AAA">
    <xsd:complexType mixed="false">
      <xsd:choice minOccurs="1" maxOccurs="1">
        <xsd:element name="BBB" type="xsd:string"/>
        <xsd:element name="CCC" type="xsd:string"/>
      </xsd:choice>
    </xsd:complexType>
  </xsd:element>
</xsd:schema>

2. Relax NG

We will use the "choice" patterns.

Valid document


<AAA xmlns="">
  <BBB>111</BBB>
</AAA>

Valid document


<AAA xmlns="">
  <CCC>aaa</CCC>
</AAA>

Invalid document


<AAA xmlns=""/>

Invalid document


<AAA xmlns="">
  <BBB>111</BBB>
  <CCC>aaa</CCC>
</AAA>

Correct Relax NG schema (correctRelax_0.rng)


<grammar xmlns="http://relaxng.org/ns/structure/1.0" >

  <start>
    <element>
      <name ns="">AAA</name>
      <choice>
        <element>
          <name ns="">BBB</name>
          <text/>
        </element>
        <element>
          <name ns="">CCC</name>
          <text/>
        </element>
      </choice>
    </element>
  </start>
</grammar>

Correct Relax NG schema (correctRelax_1.rng)
This short version is also valid.


<element ns="" name="AAA" xmlns="http://relaxng.org/ns/structure/1.0" >
  <choice>
    <element name="BBB">
      <text/>
    </element>
    <element name="CCC">
      <text/>
    </element>
  </choice>
</element>