ZVON > Tutorials > XML Schema and Relax NG Tutorial
Index | >> Example 5 / 8 << | Prev | Next |
Contents > Restrictions > Error in restriction - namespaces in wildcards

Error in restriction - namespaces in wildcards

  1. Correct XML Schema
  2. Incorrect XML Schema
  3. Relax NG
XML Schema keys: any, restriction
Relax NG keys: nsName

1. Correct XML Schema

The restriction is valid, because the namespaces "http://foo http://bar" are in the original set of the namespaces "http://foo http://bar http://baz". Schema Component Constraint: Particle Derivation OK (Any:Any - NSSubset) .

Valid document


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

Valid document


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

Invalid document
Document is not valid, because the "http://baz" namespace is excluded by the restriction. Better say, it is not included in the set of allowed namespaces.


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

Correct XML Schema (correct_0.xsd)


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

  <xsd:element name="root" type="BBB"/>

  <xsd:complexType name="AAA">
    <xsd:sequence>
      <xsd:any namespace="http://foo http://bar http://baz" minOccurs="1" maxOccurs="1" processContents="skip"/>
    </xsd:sequence>
  </xsd:complexType>

  <xsd:complexType name="BBB">
    <xsd:complexContent>
      <xsd:restriction base="AAA">
        <xsd:sequence>
          <xsd:any namespace="http://foo http://bar" minOccurs="1" maxOccurs="1" processContents="skip"/>
        </xsd:sequence>
      </xsd:restriction>
    </xsd:complexContent>
  </xsd:complexType>
</xsd:schema>

2. Incorrect XML Schema

The restriction is not valid, because the namespace "http://xxx" is not in the original set of the namespaces "http://foo http://bar http://baz". Schema Component Constraint: Particle Derivation OK (Any:Any - NSSubset) .

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:sequence>
      <xsd:any namespace="http://foo http://bar http://baz" minOccurs="1" maxOccurs="1" processContents="skip"/>
    </xsd:sequence>
  </xsd:complexType>

  <xsd:complexType name="BBB">
    <xsd:complexContent>
      <xsd:restriction base="AAA">
        <xsd:sequence>
          <xsd:any namespace="http://xxx http://bar" minOccurs="1" maxOccurs="1" processContents="skip"/>
        </xsd:sequence>
      </xsd:restriction>
    </xsd:complexContent>
  </xsd:complexType>
</xsd:schema>

3. Relax NG

Relax NG does not provide such complex derivations (correct me, if I am wrong), but we can very easily use the rules below.

Valid document


<root xmlns="">
  <x xmlns="http://foo" >1</x>
</root>

Valid document


<root xmlns="">
  <x xmlns="http://bar" >1</x>
</root>

Invalid document
Document is not valid, because the "http://baz" namespace is not in set of allowed namespaces.


<root xmlns="">
  <x xmlns="http://baz" >1</x>
</root>

Correct Relax NG schema (correctRelax_0.rng)


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

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

  <define name="BBB">
    <element>
      <choice>
        <nsName ns="http://foo"/>
        <nsName ns="http://bar"/>
      </choice>
      <text/>
    </element>
  </define>
</grammar>