W3C home > Mailing lists > Public > xmlschema-dev@w3.org > August 2004

Re: XML Schema Question

From: Jeni Tennison <jeni@jenitennison.com>
Date: Mon, 23 Aug 2004 14:17:35 +0100
Message-ID: <1039387555.20040823141735@jenitennison.com>
To: "Asleson, Ryan" <asleson@BIWORLDWIDE.com>
CC: "'xmlschema-dev@w3.org'" <xmlschema-dev@w3.org>

Hi Ryan,

> How can I specify this in the XML schema? According to the
> documentation I've seen, the complexType tag must use an occurrence
> indicator of all, choice, or sequence. All might work, since order
> doesn't matter, but apparently it specifies that each child element
> can occur once and only once once, which doesn't work. Choice
> doesn't work because only one of the elements can appear. Sequence
> might work because it allows me to specify multiple occurrences of
> child elements, but it enforces the order of the child elements,
> which I don't want.
>
> How can I specify this complex type in the XML schema? I'm sure it
> can be done, I'm just not sure how.

This is the most frequent of FAQs. It can't be done in XML Schema.
Your options are:

1. Constrain the order as in your current schema, and use a simple
transformation to transform the any-order documents into the
constrained-order documents, which you can then validate.

2. Use a content model with no constraints on occurrence, as in:

  <xs:choice minOccurs="0" maxOccurs="unbounded">
    <xs:element ref="father" />
    <xs:element ref="mother" />
    <xs:element ref="son" />
    <xs:element ref="daughter" />
    <xs:element ref="pet" />
  </xs:choice>

and add supplementary Schematron rules to constrain the occurrence of
each of the elements. The Schematron rules can be processed in a
separate step.

3. Switch to using RELAX NG, where you can do:

  <interleave>
    <optional><ref name="father" /></optional>
    <optional><ref name="mother" /></optional>
    <zeroOrMore><ref name="son" /></zeroOrMore>
    <zeroOrMore><ref name="daughter" /></zeroOrMore>
    <zeroOrMore><ref name="pet" /></zeroOrMore>
  </interleave>

or, in compact syntax:

  father? & mother? & son* & daughter* & pet*

Cheers,

Jeni

---
Jeni Tennison
http://www.jenitennison.com/
Received on Monday, 23 August 2004 13:17:49 UTC

This archive was generated by hypermail 2.3.1 : Wednesday, 5 February 2014 07:15:10 UTC