- From: Jeni Tennison <jeni@jenitennison.com>
- Date: Mon, 4 Mar 2002 21:05:33 +0000
- To: Pete Johnston <p.johnston@ukoln.ac.uk>
- CC: xmlschema-dev@w3.org
Hi Pete,
> I'd like to set up a an xs:group which permits a set of elements to
> be all optional and all repeatable. I've tried the following:
>
> [assuming I have created a named complexType for "elementType"]
[snip]
> <xs:group name="elementsGroup">
> <xs:choice minOccurs="0" maxOccurs="unbounded">
> <xs:element ref="title" minOccurs="0" maxOccurs="unbounded"/>
> <xs:element ref="creator" minOccurs="0" maxOccurs="unbounded"/>
> <xs:element ref="subject" minOccurs="0" maxOccurs="unbounded"/>
> </xs:choice>
> </xs:group>
>
> XML Spy 4.3 seems to accept this (and give the desired behaviour on
> validating instances against it), but both XSV (current online
> service) and Xerces C++ 1.6.0 object to the use of
> minOccurs/maxOccurs on the xs:choice element.
>
> The error message from XSV refers to "Invalid per cvc-complex-type.1.3"
> but I'm struggling to see which rule at
It's certainly strange that XSV is indicating that as the location of
the error. The problem, I think, is that the XML representation of the
group is invalid as per "Schema Representation Constraint: Model Group
Definition Representation OK":
"In addition to the conditions imposed on <group> element
information items by the schema for schemas, the corresponding model
group definition, if any, must satisfy the conditions set out in
Constraints on Model Group Schema Components (§3.8.6)."
http://www.w3.org/TR/xmlschema-1/#section-Constraints-on-XML-Representations-of-Model-Group-Definitions
If you have a look at the schema for schema about top-level xs:group
elements, you should see the declaration:
<xs:element name="group" type="xs:namedGroup" id="group">
<xs:annotation>
<xs:documentation source="http://www.w3.org/TR/xmlschema-1/#element-group"/>
</xs:annotation>
</xs:element>
The xs:namedGroup complex type is defined as:
<xs:complexType name="namedGroup">
<xs:annotation>
<xs:documentation>Should derive this from realGroup, but too complicated
for now</xs:documentation>
</xs:annotation>
<xs:sequence>
<xs:element ref="xs:annotation" minOccurs="0"/>
<xs:choice minOccurs="1" maxOccurs="1">
<xs:element name="all">
<xs:complexType>
<xs:complexContent>
<xs:restriction base="xs:all">
<xs:group ref="xs:allModel"/>
<xs:attribute name="minOccurs" use="prohibited"/>
<xs:attribute name="maxOccurs" use="prohibited"/>
</xs:restriction>
</xs:complexContent>
</xs:complexType>
</xs:element>
<xs:element name="choice" type="xs:simpleExplicitGroup"/>
<xs:element name="sequence" type="xs:simpleExplicitGroup"/>
</xs:choice>
</xs:sequence>
<xs:attribute name="name" use="required" type="xs:NCName"/>
<xs:attribute name="ref" use="prohibited"/>
<xs:attribute name="minOccurs" use="prohibited"/>
<xs:attribute name="maxOccurs" use="prohibited"/>
</xs:complexType>
The important thing here is that the xs:choice and xs:sequence
elements have the type xs:simpleExplicitGroup, which is defined as:
<xs:complexType name="simpleExplicitGroup">
<xs:complexContent>
<xs:restriction base="xs:explicitGroup">
<xs:sequence>
<xs:element ref="xs:annotation" minOccurs="0"/>
<xs:group ref="xs:nestedParticle" minOccurs="0" maxOccurs="unbounded"/>
</xs:sequence>
<xs:attribute name="minOccurs" use="prohibited"/>
<xs:attribute name="maxOccurs" use="prohibited"/>
</xs:restriction>
</xs:complexContent>
</xs:complexType>
As you can see, the minOccurs and maxOccurs attributes are prohibited.
So basically it's illegal to provide the minOccurs/maxOccurs
attributes on the model groups within the named groups; you need to
put these attribute on the *reference* to the group instead:
<xs:group ref="elementsGroup" minOccurs="0" maxOccurs="unbounded" />
Hmm... or, I suppose, you might be able to get around this constraint
by putting the xs:choice within a xs:sequence, with something like:
<xs:group name="elementsGroup">
<xs:sequence>
<xs:choice minOccurs="0" maxOccurs="unbounded">
<xs:element ref="title" />
<xs:element ref="creator" />
<xs:element ref="subject" />
</xs:choice>
</xs:sequence>
</xs:group>
since it's an XML representation constraint. I'm not certain, though.
Cheers,
Jeni
---
Jeni Tennison
http://www.jenitennison.com/
Received on Monday, 4 March 2002 16:05:42 UTC