- From: Henry S. Thompson <ht@cogsci.ed.ac.uk>
- Date: 21 Nov 2001 11:41:20 +0000
- To: "Martin Bernauer" <bernauer@dke.uni-linz.ac.at>
- Cc: <xmlschema-dev@w3.org>
"Martin Bernauer" <bernauer@dke.uni-linz.ac.at> writes:
> Concerning derivation by restriction most samples are 'easy' samples
> restricting complex types, e.g. by changing number of allowed occurences, or
> simple types.
>
> My question now is the following:
> Is it allowed to change the type of an element "b" declared at complex type
> "B", when deriving a new complex type "R" from "B" by restriction, and
> setting the type of "b" to a subtype of its former type?
>
> Or more concrete by the means of an example:
> I define complex types Person and a complex type Staff (a subtype of
> Person), furthermore a complex type for a list of persons, PersonList. I now
> want to derive a new complex type StaffList from PersonList, restricting the
> type of its only element "entry" from Person to Staff.
Yes, that should be possible.
> For me this is definitely a derivation by restriction, nevertheless IBMs
> schema quality checker rejects it, and I suppose XML Spy has limitations
> concerning derivation by restrictions (it accepts the schema below).
>
> <xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema"
> elementFormDefault="qualified" attributeFormDefault="qualified"
> targetNamespace="http://sample.org" xmlns:sam="http://sample.org">
> <xs:complexType name="Person">
> <xs:sequence>
> <xs:element name="name"/>
> </xs:sequence>
> </xs:complexType>
> <xs:complexType name="Staff">
> <xs:complexContent>
> <xs:extension base="sam:Person">
> <xs:sequence>
> <xs:element name="ssnr"/>
> <xs:element name="address"/>
> </xs:sequence>
> </xs:extension>
> </xs:complexContent>
> </xs:complexType>
> <xs:complexType name="PersonList">
> <xs:sequence>
> <xs:element name="entry" type="sam:Person"/>
> </xs:sequence>
> </xs:complexType>
> <xs:complexType name="StaffList">
> <xs:complexContent>
> <xs:restriction base="sam:PersonList">
> <xs:sequence>
> <xs:element name="entry" type="sam:Staff"/>
> </xs:sequence>
> </xs:restriction>
> </xs:complexContent>
> </xs:complexType>
> </xs:schema>
Ah, but Staff is not a restriction of Person, it's an extension.
To achieve your goal, you need to:
a) Declare <entry> at the top level (you may want to make it
abstract);
b) Declare <xs:element name='staff' type='sam:Staff'
substitutionGroup='sam:entry'/>
c) change StaffList to have
<xs:element ref='sam:staff'/>
as its content model.
If the namechange (from <entry> in the general case to <staff> in the
restricted case) is not acceptable, then you can't derive StaffList
from PersonList, I'm afraid.
ht
--
Henry S. Thompson, HCRC Language Technology Group, University of Edinburgh
W3C Fellow 1999--2001, part-time member of W3C Team
2 Buccleuch Place, Edinburgh EH8 9LW, SCOTLAND -- (44) 131 650-4440
Fax: (44) 131 650-4587, e-mail: ht@cogsci.ed.ac.uk
URL: http://www.ltg.ed.ac.uk/~ht/
Received on Wednesday, 21 November 2001 06:40:20 UTC