W3C home > Mailing lists > Public > xmlschema-dev@w3.org > April 2008

RE: Issue with repeating tags using substitution groups

From: Michael Kay <mike@saxonica.com>
Date: Mon, 7 Apr 2008 09:30:36 +0100
To: "'David Broker'" <davidb@warpedweb.net>, <xmlschema-dev@w3.org>
Message-ID: <018e01c89889$a7cc6170$6401a8c0@turtle>
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 GMT

This archive was generated by hypermail 2.2.0+W3C-0.50 : Monday, 16 March 2009 11:13:41 GMT