RE: Issue with repeating tags using substitution groups

I don't think this can be done in XML Schema 1.0. 
 
When you're trying to write a schema to describe an existing XML document
structure, it's often the case that not all the constraints can be
expressed.
 
Michael Kay
http://www.saxonica.com/


  _____  

From: xmlschema-dev-request@w3.org [mailto:xmlschema-dev-request@w3.org] On
Behalf Of David Broker
Sent: 07 April 2008 07:26
To: xmlschema-dev@w3.org
Subject: Issue with repeating tags using substitution groups



Hi,

I'm currently having an issue with defining a schema for some existing XML
(i.e. the XML structure cannot change)

The structure looks like this:

<document>
   <letter>
 <header>...</header>
 <data1>...</data1>
 <data2>...</data2>
   </letter>
   <letter>
 <header>...</header>
 <data2>...</data2>
 <data4>...</data4>
 <data1>...</data1>

   </letter>
</document>


Each letter is repeated, with a header first, then a mixture of "data" tag
which can be in any order,
but can only occur once. The "data" tags are defined by substitution groups
and are complex types.

Here is my schema:

<xs:element name="document">
 <xs:complexType>
  <xs:sequence>
   <xs:element name="letter" type="letter" minOccurs="1"
maxOccurs="unbounded" />
  </xs:sequence>
 </xs:complexType>
</xs:element>

<xs:complexType name="letter">
 <xs:sequence>
  <xs:element ref="header" />
  <xs:element ref="DataBlock" minOccurs="1" maxOccurs="unbounded" />
 </xs:sequence>
</xs:complexType>

<xs:element name="header">
...
</xs:element>

<xs:element name="DataBlock" type="DataBlockType" abstract="true" />
<xs:complexType name="DataBlockType" abstract="true" />

<xs:element name="data1" substitutionGroup="DataBlock">
 <xs:complexType>
  <xs:complexContent>
   <xs:extension base="DataBlockType">
    <xs:sequence>
     <xs:element name="id" type="xs:integer" />
    </xs:sequence>
   </xs:extension>
  </xs:complexContent>
 </xs:complexType>
</xs:element>

My problem is how to get the "DataBlock" tags to only repeat once. 
The above workds fine execpt that the tags can be repeated. I have tried
combinations
of xs:choice, xs:all and xs:group but I cannot get it to work.

For example, this is valie, but shouldn't be:
<letter>
<header>...</header>
<data1>...</data1>
<data2>...</data2>
<data1>...</data1>
<data1>...</data2>
</letter>

Any ideas?

Thanks!
David

Received on Monday, 7 April 2008 08:31:19 UTC