ZVON > Tutorials > XML Schema and Relax NG Tutorial
Index | >> Example 4 / 4 << | Prev | Next |
Contents > Naming and definitions > Error - simpleType and complexType have the same name

Error - simpleType and complexType have the same name

  1. XML Schema
  2. Relax NG - combine attribute set to "choice"
  3. Relax NG - combine attribute set to "interleave"
XML Schema keys: type, name
Relax NG keys: name, combine

1. XML Schema

SimpleTypes and complexTypes share the same symbol space, thus you can't define a simpleType named "a" and a complexType named "a" at the same time in the target namespace.

Correct XML Schema (correct_0.xsd)
There is a name mismatch.


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

  <xsd:element name="a" type="a"/>

  <xsd:complexType name="a">
    <xsd:sequence>
      <xsd:element name="b" type="xsd:string"/>
    </xsd:sequence>
  </xsd:complexType>

  <xsd:simpleType name="a">
    <xsd:restriction base="xsd:string"/>
  </xsd:simpleType>
</xsd:schema>

2. Relax NG - combine attribute set to "choice"

Relax NG allows multiple patterns with the same name. However, it requires to specify, whether these patterns will be interleaved or whether we will choose one of the possibilities. Here we will make a choice.

Valid document


<root xmlns="">
  <X>xx</X>
</root>

Valid document


<root xmlns="">
  <Y>yy</Y>
</root>

Invalid document
Because the "combine" attribute is set to "choice", there cannot be both "X" and "Y" at the same time.


<root xmlns="">
  <X>xx</X>
  <Y>yy</Y>
</root>

Invalid document
Because the "combine" attribute is set to "choice", there cannot be both "X" and "Y" at the same time.


<root xmlns="">
  <Y>yy</Y>
  <X>xx</X>
</root>

Correct Relax NG schema (correctRelax_0.rng)


<grammar datatypeLibrary="http://www.w3.org/2001/XMLSchema-datatypes" ns="" xmlns="http://relaxng.org/ns/structure/1.0" >

  <start>
    <element name="root">
      <ref name="a"/>
    </element>
  </start>

  <define name="a" combine="choice">
    <element name="X">
      <text/>
    </element>
  </define>

  <define name="a" combine="choice">
    <element name="Y">
      <text/>
    </element>
  </define>
</grammar>

3. Relax NG - combine attribute set to "interleave"

Relax NG allows multiple patterns with the same name. However, it requires to specify, whether these patterns will be interleaved or "choiced". Here we will make an interleave.

Valid document


<root xmlns="">
  <X>xx</X>
  <Y>yy</Y>
</root>

Valid document


<root xmlns="">
  <Y>yy</Y>
  <X>xx</X>
</root>

Invalid document
Because the "combine" attribute is set to "interleave", the "Y" element is missing.


<root xmlns="">
  <X>xx</X>
</root>

Invalid document
Because the "combine" attribute is set to "interleave", the "X" element is missing.


<root xmlns="">
  <Y>yy</Y>
</root>

Correct Relax NG schema (correctRelax_0.rng)


<grammar datatypeLibrary="http://www.w3.org/2001/XMLSchema-datatypes" ns="" xmlns="http://relaxng.org/ns/structure/1.0" >

  <start>
    <element name="root">
      <ref name="a"/>
    </element>
  </start>

  <define name="a" combine="interleave">
    <element name="X">
      <text/>
    </element>
  </define>

  <define name="a" combine="interleave">
    <element name="Y">
      <text/>
    </element>
  </define>
</grammar>