Re: Schema - conjunction question

Hello again, Baptiste,

Thanks for this solution. I can see that it will work. However, as you
pointed out, the numbers of model groups (n!) can become unwieldy in
short order.
I am generating schema from existing data definition files which have,
in many cases, more than 10 data items. Each data item in turn has its
own derivation, mostly of simpleType. As you can see, such a solution
would result huge schemas.

I'll keep looking and working on it and will let you know if I come up
with anything.
cheers,
jw

> Hi John,
> 
> > I have a question reqarding the order imposed on elements in a schema.
> 
> I think you will get more answers on xmlschema-dev@w3.org
> 
> > The document "XML Schema Part 1: Structures, W3C Recommendation 2 May
> > 2001" says that a model group may be one of three types as follows:
> >
> > "2.2.3.1 Model Group
> >
> > A model group is a constraint in the form of a grammar fragment that
> > applies to lists of element information items. It consists of a list of
> > particles, i.e. element
> > declarations, wildcards and model groups. There are three varieties of
> > model group:
> >
> >      Sequence (the element information items match the particles in
> > sequential order);
> >      Conjunction (the element information items match the particles, in
> > any order);
> >      Disjunction (the element information items match one of the
> > particles)."
> >
> > I think I want a "Conjunction" (instead of a sequence) but I can't seem
> > to find an appropriate example of  how to construct such a conjunction.
> > Can anyone point me to some material which addresses this variation?
> >
> 
> you should use the <all> compositor, as said in the "XML Schema Part 1:
> Structures" document :
> 
> "3.8.1 The Model Group Schema Component
> The model group schema component has the following properties:
> 
> Schema Component: Model Group
> {compositor}
> One of all, choice or sequence.
> {particles}
> A list of particles
> {annotation}
> Optional. An annotation.
> specifies a sequential (sequence), disjunctive (choice) or conjunctive (all)
> interpretation of the {particles}. This in turn determines whether the
> element information item [children] ·validated· by the model group must:
> 
> (sequence) correspond, in order, to the specified {particles};
> (choice) corresponded to exactly one of the specified {particles};
> (all) contain all and only exactly zero or one of each element specified in
> {particles}. The elements can occur in any order. In this case, to reduce
> implementation complexity, {particles} is restricted to contain local and
> top-level element declarations only, with {min occurs}=0 or 1, {max
> occurs}=1. "
> 
> "Example
> <xs:all>
>  <xs:element ref="cats"/>
>  <xs:element ref="dogs"/>
> </xs:all>"
> 
> > I am trying to define a complexType which may have its elements in any
> > order with the usual range of constraints on each element. Some elements
> > may have maxOccurs > 1.
> 
> this is more complex, as "{particles} is restricted to contain local and
> top-level element declarations only, with {min occurs}=0 or 1, {max
> occurs}=1" when using the <all> compositor.
> 
> what you can do is:
> 
> <xs:group name="myModelGroup1">
>     <xs:sequence>
>         <xs:element
>             minoccurs="0"
>             maxoccurs="whateverOccurYouNeed"
>             ref="someThing"/>
>         <xs:element ref="anotherThing"/>
>         <xs:element ref="yetAnotherThing"/>
>     </xs:sequence>
> </xs:group>
> 
> <xs:group name="myModelGroup2">
>     <xs:sequence>
>         <xs:element
>             minoccurs="0"
>             maxoccurs="whateverOccurYouNeed"
>             ref="someThing"/>
>         <xs:element ref="yetAnotherThing"/>
>         <xs:element ref="anotherThing"/>
>     </xs:sequence>
> </xs:group>
> 
> <xs:group name="myModelGroup3">
>     <xs:sequence>
>         <xs:element ref="anotherThing"/>
>         <xs:element ref="yetAnotherThing"/>
>         <xs:element
>             minoccurs="0"
>             maxoccurs="whateverOccurYouNeed"
>             ref="someThing"/>
>     </xs:sequence>
> </xs:group>
> 
> <xs:group name="myModelGroup4">
>     <xs:sequence>
>         <xs:element ref="anotherThing"/>
>         <xs:element
>             minoccurs="0"
>             maxoccurs="whateverOccurYouNeed"
>             ref="someThing"/>
>         <xs:element ref="yetAnotherThing"/>
>     </xs:sequence>
> </xs:group>
> 
> <xs:group name="myModelGroup5">
>     <xs:sequence>
>         <xs:element ref="yetAnotherThing"/>
>         <xs:element ref="anotherThing"/>
>         <xs:element
>             minoccurs="0"
>             maxoccurs="whateverOccurYouNeed"
>             ref="someThing"/>
>     </xs:sequence>
> </xs:group>
> 
> <xs:group name="myModelGroup6">
>     <xs:sequence>
>         <xs:element ref="yetAnotherThing"/>
>         <xs:element
>             minoccurs="0"
>             maxoccurs="whateverOccurYouNeed"
>             ref="someThing"/>
>         <xs:element ref="anotherThing"/>
>     </xs:sequence>
> </xs:group>
> 
> <xs:complexType name="myComplexType">
>     <xs:choice>
>         <xs:group ref="myModelGroup1"/>
>         <xs:group ref="myModelGroup2"/>
>         <xs:group ref="myModelGroup3"/>
>         <xs:group ref="myModelGroup4"/>
>         <xs:group ref="myModelGroup5"/>
>         <xs:group ref="myModelGroup6"/>
>     </xs:choice>
> </xs:complexType>
> 
> this will end with the regular expr you want (where someThing element is
> "s", anotherThing element is "a" and yetAnotherThing element is "y")  :
> ( sa*y | sya* | a*ys | a*sy | ya*s | ysa* )
> where the multiple element is bounded to "whateverOccurYouNeed"
> 
> Well, I hope someone has a better solution, because this one force to define
> !n groups... (n is the number of different elements)
> 
>

Received on Thursday, 9 August 2001 11:53:15 UTC