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

Re: Issue with repeating tags using substitution groups

From: David Broker <davidb@warpedweb.net>
Date: Tue, 8 Apr 2008 11:23:28 +1000
Message-ID: <671d7caa0804071823y7eb6479er282261398b47c9d8@mail.gmail.com>
To: xmlschema-dev@w3.org
Thanks Michael,

I was beginning to think that myself.

I've decided to ignore the the fact that the header tag must be first and
add all the children of <letter> to a group using <xsd:all>. The most
important constraint is that the "data" tags can appear only once and in any
order.

My main aim was to not have to add each "data" element to a group but it
doesn't look like I will be able to avoid that.

Here is the resulting schema:

<xs:element name="document">
 <xs:complexType>
  <xs:sequence>

   <xs:element name="letter" minOccurs="1" maxOccurs="unbounded">
    <xs:complexType>
     <xs:group ref="dataBlockGroup"/>

    </xs:complexType>
   </xs:element>
  </xs:sequence>
 </xs:complexType>
</xs:element>
<xs:group name="dataBlockGroup">
 <xs:all>
  <xs:element ref="header" minOccurs="0" maxOccurs="1"/>
  <xs:element ref="data1" minOccurs="0" maxOccurs="1"/>
 </xs:all>
</xs:group>
<xs:element name="header">
 <xs:complexType>
  <xs:sequence>
   <xs:element name="headerId" type="xs:integer" />
  </xs:sequence>
 </xs:complexType>
</xs:element>
<xs:element name="data1">
 <xs:complexType>
  <xs:sequence>

   <xs:element name="id" type="xs:integer" />
  </xs:sequence>

 </xs:complexType>
</xs:element>

Thank you Michael & Borris for you help.

Regards,
David

On Mon, Apr 7, 2008 at 6:30 PM, Michael Kay <mike@saxonica.com> wrote:

>    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 Tuesday, 8 April 2008 01:55:35 UTC

This archive was generated by hypermail 2.4.0 : Friday, 17 January 2020 23:15:46 UTC