- From: Priscilla Walmsley <priscilla@walmsley.com>
- Date: Fri, 19 Oct 2001 12:24:44 -0400
- To: "'Jeni Tennison'" <jeni@jenitennison.com>, "'Dolan, Kieran'" <DolanK@logica.com>
- Cc: <xmlschema-dev@w3.org>
> Unfortunately, this method isn't really much help unless you're able > to define your own abstract type (so that the author of the instance > is forced to use xsi:type) from which the types that you want to > permit both derive. I don't think you can do this in this situation, > though perhaps someone else can find a way. You can't extend simple content to create complex content, but you _can_ restrict mixed complex content to create simple content. In this situation, you would define the types as: <xs:complexType name="baseType" mixed="true" abstract="true"> <xs:sequence> <xs:any minOccurs="0" maxOccurs="unbounded"/> </xs:sequence> </xs:complexType> <xs:complexType name="simpleType"> <xs:simpleContent> <xs:restriction base="baseType"> <xs:simpleType> <xs:restriction base="xs:integer"/> </xs:simpleType> </xs:restriction> </xs:simpleContent> </xs:complexType> <xs:complexType name="complexType"> <xs:complexContent> <xs:restriction base="baseType"> <xs:sequence> <xs:element name="Y" type="xs:integer" /> </xs:sequence> </xs:restriction> </xs:complexContent> </xs:complexType> This is somewhat obscure but allowed by the Rec. Like Jeni said, you would have to use xsi:type in the instance if you did this. Priscilla ----------------------------------------------------------- Priscilla Walmsley priscilla@walmsley.com Vitria Technology http://www.vitria.com Author, Definitive XML Schema (Prentice Hall, Dec. 2001) ----------------------------------------------------------- > -----Original Message----- > From: xmlschema-dev-request@w3.org > [mailto:xmlschema-dev-request@w3.org]On Behalf Of Jeni Tennison > Sent: Friday, October 19, 2001 11:56 AM > To: Dolan, Kieran > Cc: xmlschema-dev@w3.org > Subject: Re: constraining an element to be either simple or complex > content > > > Hi Kieran, > > > Is there any way in XML schema to specify that an element contains > > either simple content or complex content but not both?. > > Basically, no. > > > For example: <X>23</X> is valid and <X><Y>45</Y></X> is also valid > > but not <X>23<Y>45</Y></X>. Use of a "mixed" content model permits > > the first two cases but does not exclude the last one. > > You could go this route and add a schema adjunct (some RELAX NG or > Schematron elements in xs:appinfo) that went on to define more tightly > that the X element can either have text or a Y element as a child. Of > course you would have to pull out these extra constraints yourself in > order to test them, but they'd be there in the schema for > documentation purposes. > > > I have tried to extend a complex type containing complex content > > from a complex type containing simple content. XML Spy version 4.0 > > allows this but I understand from previous postings in this group > > that this is not a correct XML schema construct. > > That's right - you're not allowed to extend a simple type with a > complex type (Clause 1 of Schema Representation Constraint: Complex > Type Definition Representation OK at > http://www.w3.org/TR/xmlschema-1/#src-ct). > > Cheers, > > Jeni > > P.S. > > The only other thing that I can think of would be to use xsi:type > on the instance document to indicate what type the X element should > be. In the schema, define it as being xs:anyType: > > <xs:element name="X" type="xs:anyType" /> > > and define types in your schema for the simple and complex types that > you want, e.g.: > > <xs:simpleType name="simpleType"> > <xs:restriction base="xs:integer" /> > </xs:simpleType> > > <xs:complexType name="complexType"> > <xs:sequence> > <xs:element name="Y" type="xs:integer" /> > </xs:sequence> > </xs:complexType> > > and then use xsi:type to indicate the type of a particular X within > the instance document: > > <X xsi:type="simpleType">23</X> > <X xsi:type="complexType"><Y>45</Y></X> > > Unfortunately, this method isn't really much help unless you're able > to define your own abstract type (so that the author of the instance > is forced to use xsi:type) from which the types that you want to > permit both derive. I don't think you can do this in this situation, > though perhaps someone else can find a way. > > --- > Jeni Tennison > http://www.jenitennison.com/ > >
Received on Friday, 19 October 2001 12:26:18 UTC