ZVON > Tutorials > XML Schema and Relax NG Tutorial
Index | >> Example 4 / 9 << | Prev | Next |
Contents > Simple tasks > Element which contains elements only (order does not matter)

Element which contains elements only (order does not matter)

  1. XML Schema
  2. Relax NG
XML Schema keys: all
Relax NG keys: interleave

1. XML Schema

We want to have the root element to be named "AAA", from null namespace and contains one "BBB" and one "CCC" element. Their order is not important.

Valid document


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

Valid document


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

Invalid document
Element CCC is missing.


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

Invalid document
Element BBB is missing.


<AAA xsi:noNamespaceSchemaLocation="correct_0.xsd" xmlns="" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" >
  <CCC>zz</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:all minOccurs="1" maxOccurs="1">
        <xsd:element name="BBB" type="xsd:string"/>
        <xsd:element name="CCC" type="xsd:string"/>
      </xsd:all>
    </xsd:complexType>
  </xsd:element>
</xsd:schema>

2. Relax NG

Use the "interleave" pattern.

Valid document


<AAA xmlns="">
  <BBB>XXX</BBB>
  <CCC> cc </CCC>
</AAA>

Valid document


<AAA xmlns="">
  <CCC/>
  <BBB>XXX</BBB>
</AAA>

Invalid document
Element CCC is missing.


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

Invalid document
Element BBB is missing.


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

Correct Relax NG schema (correctRelax_0.rng)


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

  <start>
    <element>
      <name ns="">AAA</name>
      <interleave>
        <element>
          <name ns="">BBB</name>
          <text/>
        </element>
        <element>
          <name ns="">CCC</name>
          <text/>
        </element>
      </interleave>
    </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" >
  <interleave>
    <element name="BBB">
      <text/>
    </element>
    <element name="CCC">
      <text/>
    </element>
  </interleave>
</element>