- From: George Bina <george@oxygenxml.com>
- Date: Thu, 25 Feb 2016 20:15:25 +0200
- To: "Costello, Roger L." <costello@mitre.org>, "xmlschema-dev@w3.org" <xmlschema-dev@w3.org>
Well, in general Xerces is right, according with the 1.0 spec, which defines the algorithm as a normative reference. Basically, according to 2.1 of https://www.w3.org/TR/xmlschema-1/#cos-particle-restrict Any top-level element declaration particle (in R or B) which is the {substitution group affiliation} of one or more other element declarations and whose ·substitution group· contains at least one element declaration other than itself is treated as if it were a choice group whose {min occurs} and {max occurs} are those of the particle, and whose {particles} consists of one particle with {min occurs} and {max occurs} of 1 for each of the declarations in its ·substitution group·. the algorithm will try to align <xs:choice minOccurs="0" maxOccurs="unbounded"> <xs:element ref="A" minOccurs="1" maxOccurs="1"/> <xs:element ref="B" minOccurs="1" maxOccurs="1"/> </xs:choice> as base, against <xs:element ref="B" minOccurs="0" /> as derived. Having an element in the derived and a choice in the base will get us to follow the rule https://www.w3.org/TR/xmlschema-1/#rcase-RecurseAsIfGroup which will check <xs:choice minOccurs="0" maxOccurs="unbounded"> <xs:element ref="A" minOccurs="1" maxOccurs="1"/> <xs:element ref="B" minOccurs="1" maxOccurs="1"/> </xs:choice> as base, against <xs:choice minOccurs="1" maxOccurs="1"> <xs:element ref="B" minOccurs="0" /> </xs:choice> as derived, according to *** For an element declaration particle to be a ·valid restriction· of a group particle (all, choice or sequence) a group particle of the variety corresponding to B's, with {min occurs} and {max occurs} of 1 and with {particles} consisting of a single particle the same as the element declaration must be a ·valid restriction· of the group as defined by Particle Derivation OK, (All:All,Sequence:Sequence -- Recurse) (§3.9.6), Particle Derivation OK (Choice:Choice -- RecurseLax) (§3.9.6) or Particle Derivation OK (All:All,Sequence:Sequence -- Recurse) (§3.9.6), depending on whether the group is all, choice or sequence. *** Which will get us to https://www.w3.org/TR/xmlschema-1/#rcase-RecurseLax where the occurrence range is ok, but we need to check *** 2 There is a complete ·order-preserving· functional mapping from the particles in the {particles} of R to the particles in the {particles} of B such that each particle in the {particles} of R is a ·valid restriction· of the particle in the {particles} of B it maps to as defined by Particle Valid (Restriction) (§3.9.6). *** for <xs:element ref="A" minOccurs="1" maxOccurs="1"/> <xs:element ref="B" minOccurs="1" maxOccurs="1"/> against the derived <xs:element ref="B" minOccurs="0" /> and we cannot find that as the range check of the reference to B in the base type will not include the range specified in the reference to B in the derived type. So, it looks like Xerces is right to report an error and it points exactly to point 2 from the above rule https://www.w3.org/TR/xmlschema-1/#rcase-RecurseLax but of course that is not intuitive, but it is the conformant behavior according to the 1.0 spec. You can see also now that if you put minOccurs="1" on B in the derived type: <xs:element ref="B" minOccurs="1" /> then that will match against the (1:1) occurrence in the base and that is why you do not get an error in that case. Hope this helps! Best Regards, George -- George Cristian Bina <oXygen/> XML Editor, Schema Editor and XSLT Editor/Debugger http://www.oxygenxml.com On 25/02/16 19:01, Costello, Roger L. wrote: > <xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema" > xmlns:vc="http://www.w3.org/2007/XMLSchema-versioning" vc:minVersion="1.1"> > > <xs:element name="A" type="xs:double" /> > <xs:element name="B" substitutionGroup="A" type="xs:double" /> > > <xs:complexType name="base"> > <xs:sequence> > <xs:element ref="A" minOccurs="0" maxOccurs="unbounded" /> > </xs:sequence> > </xs:complexType> > > <xs:complexType name="derived"> > <xs:complexContent> > <xs:restriction base="base"> > <xs:sequence> > <xs:element ref="B" minOccurs="0" /> > </xs:sequence> > </xs:restriction> > </xs:complexContent> > </xs:complexType> > </xs:schema>
Received on Thursday, 25 February 2016 18:15:56 UTC