Re: XML Schema Question

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