Ambiguous XML schema

Dana picture Dana · Dec 22, 2008 · Viewed 7.1k times · Source

I'm trying to produce a pretty simple XML schema for an XML similar to the following:

<messages>
  <item>
    <important_tag></important_tag>
  </item>
  <item>
    <important_tag></important_tag>
    <tag2></tag2>
  </item>
  <item>
    <tag2></tag2>
    <tag3></tag3>
  </item>
</messages>

The idea is that <important_tag> will have a specific definition AND it may or may not appear under <item>. It may also appear more than once. Additionally, there may be other tags before or after <important_tag> that I can not name in advance.

I would like to give a specific definition for <important_tag>. For example, define attributes that it must contain. What I mean is that if important_tag is present it must conform to my definition. Any other tag doesn't have to conform to any definition.

I tried using the following scheme:

<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema">
  <xs:element name="messages">
    <xs:complexType>
      <xs:sequence>
        <xs:element ref="item" maxOccurs="unbounded"/>
      </xs:sequence>
    </xs:complexType>
  </xs:element>
  <xs:element name="item">
    <xs:complexType>
      <xs:sequence>
        <xs:element ref="important_tag" minOccurs="0"/>
        <xs:any minOccurs="0"/>
      </xs:sequence>
    </xs:complexType>
  </xs:element>
  <xs:element name="important_tag">
    <xs:complexType>
      <xs:simpleContent>
        ... specific definitions for important_tag ...
      </xs:simpleContent>
    </xs:complexType>
  </xs:element>
</xs:schema>

This results in an error saying that the schema is ambiguous.

The exact error message is:

cos-nonambig: '<xs:element ref="important_tag">' makes the content model non-deterministic against '<xs:any>'. Possible causes: name equality, overlapping occurrence or substitution groups.

I'm using Altova's XML Spy.

How do I solve this?

Thanks, Dana

Answer

Yossi Dahan picture Yossi Dahan · Dec 22, 2008

There is a great article on MSDN that talks about desigining extensible schemas, which you can find here, I suggest you go through it all, but specifically to your point it explains why you're getting this error in point 2. under "Using XML Schema to Design a Versionable XML Format" (you can search for "non-deterministic" and get straight there.

Basically, once you have an xs:any element the validator cannot assume anything about the other sibling elements, so - you might well have a definition for important_tag that does not require those mandatory attributes and so those elements cannot be validated