- From: Jeni Tennison <jeni@jenitennison.com>
- Date: Fri, 23 Jul 2004 13:33:23 +0100
- To: Peter Menzel <peter.menzel@imise.uni-leipzig.de>
- Cc: xmlschema-dev@w3.org
Hi Peter, > The elements aa and bb are required to be there and they have to > occur exactly once. Other sub elements of element can occur many > times. Especially the order of the elements is random, so i may not > use xsd:sequence. This is one of the areas where XML Schema isn't very helpful because the kind of model group that allows elements to occur in any order (<xs:all>) only allows those elements to be optional or appear exactly once. The closest that you can get is to use a content model like: (otherElements*, ((aa, otherElements*, bb) | (bb, otherElements*, aa)), otherElements*) Use a model group to define otherElements. For example: <xs:group name="otherElements"> <xs:choice> <xs:element ref="cc" /> <xs:element ref="dd" /> </xs:choice> </xs:group> <xs:element name="element"> <xs:complexType> <xs:sequence> <xs:group ref="otherElements" minOccurs="0" maxOccurs="unbounded" /> <xs:choice> <xs:sequence> <xs:element ref="aa" /> <xs:group ref="otherElements" minOccurs="0" maxOccurs="unbounded" /> <xs:element ref="bb" /> </xs:sequence> <xs:sequence> <xs:element ref="bb" /> <xs:group ref="otherElements" minOccurs="0" maxOccurs="unbounded" /> <xs:element ref="aa" /> </xs:sequence> </xs:choice> <xs:group ref="otherElements" minOccurs="0" maxOccurs="unbounded" /> </xs:sequence> </xs:complexType> </xs:element> It's much easier in RELAX NG, in which you can use interleave as follows: <element name="element"> <interleave> <element name="aa" /> <element name="bb" /> <zeroOrMore> <element name="cc" /> </zeroOrMore> <zeroOrMore> <element name="dd" /> </zeroOrMore> </interleave> </element> Cheers, Jeni --- Jeni Tennison http://www.jenitennison.com/
Received on Friday, 23 July 2004 08:33:32 UTC