ZVON > Tutorials > XML Schema and Relax NG Tutorial
Index | >> Example 6 / 9 << | Prev | Next |
Contents > Simple tasks > Element which contains mixture of two elements (can appear more times)

Element which contains mixture of two elements (can appear more times)

  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: sequence, maxOccurs

1. XML Schema

We want to have the root element to be named "AAA", from null namespace and contains a mixture of any number (even zero) of "BBB" and "CCC" elements. You need to use the trick below - use "sequence" element with "minOccurs" attribute set to 0 and "maxOccurs" set to "unbounded", and the attribute "minOccurs" of the "element" elements must be set to 0 too.

Valid document


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

Valid document


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

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:sequence minOccurs="0" maxOccurs="unbounded">
        <xsd:element name="BBB" type="xsd:string" minOccurs="0"/>
        <xsd:element name="CCC" type="xsd:string" minOccurs="0"/>
      </xsd:sequence>
    </xsd:complexType>
  </xsd:element>
</xsd:schema>

2. Relax NG

We will use the "interleave" and "zeroOrMore" patterns.

Valid document


<AAA xmlns="">
  <BBB>111</BBB>
  <CCC>YYY</CCC>
  <BBB>222</BBB>
  <BBB>333</BBB>
  <CCC>ZZZ</CCC>
</AAA>

Valid document


<AAA xmlns=""/>

Correct Relax NG schema (correctRelax_0.rng)


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

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