- From: Stefan Wachter <Stefan.Wachter@gmx.de>
- Date: Wed, 16 Oct 2002 15:19:16 +0200 (MEST)
- To: Jeni Tennison <jeni@jenitennison.com>;xmlschema-dev@w3.org
Hi Jeni, puh, that's quite complicated. From an implementation perspective I prefer to have prohibited attributes explicit and to pass them through to derived types. But (how I learned today): the type in prohibited attribute declarations may (must?) be missing. Here pops up my next question. Is a type definition in an attribute declaration with use="prohibited" simply ignored, is it an error, or is it validated to be a subtype? Studying the spec. I found no hint that it is forbidden to have a type attribute or an inlined type definition for "prohibited" declarations. --Stefan PS: I have my fingers on the code. Maybe this topic could be settled once for all. > > Hi Stefan, > > > PS: Is it allowed to first prohibit an attribute and to introduce it > > again later? The spec. says that attribute declarations with > > use="prohibited" are nothing at all. This suggests that a type does > > not know if an attribute is prohibited or simply not present. > > Therefore adding an attribute after it was prohibited should be > > allowed. Sounds strange, doesn't it? > > Well, I *think* that you're not allowed to add back a prohibited > attribute. Clause 1.5 of Schema Component Constraint: Derivation Valid > (Extension) [1] says: > > 1.5 It must in principle be possible to derive the complex type > definition in two steps, the first an extension and the second a > restriction (possibly vacuous), from that type definition among > its ancestors whose {base type definition} is the ·ur-type > definition·. > > NOTE: This requirement ensures that nothing removed by a > restriction is subsequently added back by an extension. It is > trivial to check if the extension in question is the only > extension in its derivation, or if there are no restrictions bar > the first from the ·ur-type definition·. > > The NOTE implies that you shouldn't be able to prohibit an attribute > and then introduce it again later, but I've never been able to work > out how the clause actually guarantees that. For example, if I did: > > <xs:complexType name="T1"> > <xs:sequence /> > </xs:complexType> > > <xs:complexType name="T2"> > <xs:extension base="T1"> > <xs:attribute name="foo" /> > </xs:extension> > </xs:complexType> > > <xs:complexType name="T3"> > <xs:restriction base="T2"> > <xs:attribute name="foo" use="prohibited" /> > </xs:restriction> > </xs:complexType> > > <xs:complexType name="T4"> > <xs:extension base="T3"> > <xs:attribute name="foo" /> > </xs:extension> > </xs:complexType> > > then I can derive T4 in two steps from T1 (the type amongst T4's > ancestors whose base type definition is the ur-type definition), first > an extension: > > <xs:complexType name="_T4"> > <xs:extension base="T1"> > <xs:attribute name="foo" /> > </xs:extension> > </xs:complexType> > > and then a restriction: > > <xs:complexType name="T4"> > <xs:restriction base="_T4" /> > </xs:complexType> > > I think that the intention is that the intermediate type definition is > constructed according to the instructions: > > Constructing the intermediate type definition to check this > constraint is straightforward: simply re-order the derivation to put > all the extension steps first, then collapse them into a single > extension. If the resulting definition can be the basis for a valid > restriction to the desired definition, the constraint is satisfied. > > in which case the intermediate definition would be: > > <xs:complexType name="_T4"> > <xs:extension base="T1"> > <xs:attribute name="foo" /> > <xs:attribute name="foo" /> > </xs:extension> > </xs:complexType> > > which wouldn't be allowed because it has two attribute uses for the > same attribute, and which would therefore mean that T4 wasn't a valid > extension of T3. > > Cheers, > > Jeni > > [1] http://www.w3.org/TR/xmlschema-1/#cos-ct-extends > > --- > Jeni Tennison > http://www.jenitennison.com/ >
Received on Wednesday, 16 October 2002 09:19:48 UTC