Let say we have the following schema (from a Microsoft sample):
<xs:element name="zooAnimals">
<xs:complexType>
<xs:sequence minOccurs="0" maxOccurs="unbounded">
<xs:element name="elephant"/>
<xs:element name="bear"/>
<xs:element name="giraffe"/>
</xs:sequence>
</xs:complexType>
</xs:element>
The sequence is optional, so all elements below can appear or not.
Now, if we have:
<xs:element name="zooAnimals">
<xs:complexType>
<xs:sequence minOccurs="0" maxOccurs="unbounded">
<xs:element name="elephant" minOccurs="0" maxOccurs="1"/>
<xs:element name="bear" minOccurs="1" maxOccurs="unbounded"/>
<xs:element name="giraffe" minOccurs="1" maxOccurs="1"/>
</xs:sequence>
</xs:complexType>
</xs:element>
Elements bear
and giraffe
must be present if zooAnimals
is present.
Up to now, I'm OK.
But what if we have this (mix of the above example and "real life" XSD)?
<xs:element name="zooAnimals">
<xs:complexType>
<xs:sequence minOccurs="1" maxOccurs="1">
<xs:element name="elephant" minOccurs="1" maxOccurs="1"/>
<xs:element name="bear" minOccurs="0" maxOccurs="1"/>
<xs:element name="giraffe" minOccurs="0" maxOccurs="1"/>
</xs:sequence>
</xs:complexType>
</xs:element>
If the sequence is mandatory, why specify minOccurs
in elements, and why some ones can be with minOccurs="0"
?
CodePudding user response:
elements
bear
andgiraffe
must be present ifzooAnimals
is present. Up to now, I'm OK
This may be where you might have to adjust your understanding.
Because the xs:sequence
is optional, zooAmimals
may still be present without any of elephant
, bear
, or giraffe
being present.
If the sequence is mandatory, why specify
minOccurs
in elements, and why some ones can be withminOccurs="0"
?
You're missing that there are two levels of occurrence constraints in play:
On
xs:sequence
, the occurrence constraints apply to the sequence group collectively. The collective group might be optional, required, or be able to be repeated as a group.On the
xs:element
children ofxs:sequence
, the occurrence constraints apply to the children individually after taking into account the occurrence constraints on thexs:sequence
as a group. If thexs:sequence
is, say, optional, and the group is omitted, the individualxs:element
constraints do not matter; otherwise, thexs:element
occurrence constraints govern the occurrences of each element individually within eachxs:sequence
group occurrence.
See also
- XML Schema minOccurs / maxOccurs default values
- Meaning of minOccurs and maxOccurs for xsd:choice?
- XML Schema: usage of minOccurs and maxOccurs within xs:sequence
CodePudding user response:
In your first example
<xs:sequence minOccurs="0" maxOccurs="unbounded">
<xs:element name="elephant"/>
<xs:element name="bear"/>
<xs:element name="giraffe"/>
</xs:sequence>
your elements must appear in groups of three: elephant, bear, giraffe, elephant, bear, giraffe, elephant, bear, giraffe, ...
In your second example,
<xs:sequence minOccurs="0" maxOccurs="unbounded">
<xs:element name="elephant" minOccurs="0" maxOccurs="1"/>
<xs:element name="bear" minOccurs="1" maxOccurs="unbounded"/>
<xs:element name="giraffe" minOccurs="1" maxOccurs="1"/>
</xs:sequence>
Each group consists of zero elephants, any number of bears, and a giraffe. So you might have E B B B B G E B G B B G. But you can't have E B G G because a G ends the group and the next group must start with E or B.
(This is reminding me of Gödel, Escher, Bach....)
In your third example
<xs:sequence minOccurs="1" maxOccurs="1">
<xs:element name="elephant" minOccurs="1" maxOccurs="1"/>
<xs:element name="bear" minOccurs="0" maxOccurs="1"/>
<xs:element name="giraffe" minOccurs="0" maxOccurs="1"/>
</xs:sequence>
The sequence can't repeat. You can have E B G or E or E G or E B, but you can only have one such group, because the sequence itself can only occur once.