- From: Michael Kay <mike@saxonica.com>
- Date: Thu, 25 Feb 2016 18:41:59 +0000
- To: George Bina <george@oxygenxml.com>
- Cc: "Costello, Roger L." <costello@mitre.org>, "xmlschema-dev@w3.org" <xmlschema-dev@w3.org>
Yes, this is one of the rare occasions on which I made a conscious decision to depart from the specification and get it right where the spec got it wrong. Michael Kay Saxonica > On 25 Feb 2016, at 18:15, George Bina <george@oxygenxml.com> wrote: > > 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:44:09 UTC