Expressing varying cardinalities of unordered elements in a complex-type

Hi Jeni,

  Thanks for your reply to my message "Re: Order of elements in a
complex-type", below; it was helpful for me to see that example.  You
answered the question I asked, for sure, but I think my question was badly
formed in that it allowed for what looks like a special case answer,
including only one element of cardinality=1.
  Is there a more general way to express varying cardinalities of unordered
elements in a complex-type?  I guess I'm looking for a simple construct like
"all" that allows for >1 occurences.
  Not being used to functional programming and finding XML Schema somewhat
elusive, I just have to ask again then, a slightly different question:
  How might I use XML Schema to define a complex-type of 1 Element_A, 1
Element_B, 0 or 1 Element_C, and any number of Element_D, all appearing in
any order?
  Thanks in advance.  I'm not sure why this seemingly simple situation
doesn't appear in any of my books.

  Regards,
  Mason




-----Original Message-----
From: Jeni Tennison [mailto:jeni@jenitennison.com]
Sent: Saturday, December 01, 2001 5:39 AM
Subject: Re: Order of elements in a complex-type

Hi Mason,

> Hi all! I saw Erik Beijnoff's good answer to the above question in a
> recent thread. I wonder further, however, how could this complex
> type be defined such that the elements "TextBox" and "TextArea" may
> appear any number of times, but the element "Header" must appear
> only once, and while retaining the interesting characteristic that
> any of these three clild elements may appear in any order. Any
> ideas?

Assuming that you don't care if the TextBox and TextArea elements are
intermingled, and there's no minimum number of occurrences of TextBox
and TextArea, you could use the following:

<xs:complexType name="FormType">
  <xs:sequence>
    <xs:group ref="TextBoxOrTextArea" minOccurs="0"
              maxOccurs="unbounded" />
    <xs:element name="Header" type="HeaderType" />
    <xs:group ref="TextBoxOrTextArea" minOccurs="0"
              maxOccurs="unbounded" />
  </xs:sequence>
</xs:complexType>

<xs:group name="TextBoxOrTextArea">
  <xs:choice>
    <xs:element name="TextBox" type="TextBoxType" />
    <xs:element name="TextArea" type="TextAreaType" />
  </xs:choice>
</xs:group>

(Using a group so that you only have to declare TextBox and TextArea
once.)

Cheers,

Jeni

---
Jeni Tennison
http://www.jenitennison.com/

Received on Monday, 3 December 2001 18:39:15 UTC