RE: constraining an element to be either simple or complex content

> Is there any way in XML schema to specify that an element contains 
> either simple content or complex content but not both?.

Create a type that contains a choice.  Let one of the choice subelements
have simple content and the other complex context.  Granted, this is one
level deeper than you probably want but it'll do the job.

All the best, Ashok 
===========================================================
Ashok Malhotra              <mailto: ashokma@microsoft.com> 
Microsoft Corporation
212 Hessian Hills Road
Croton-On-Hudson, NY 10520 USA 
Redmond: 425-703-9462                New York: 914-271-6477 



-----Original Message-----
From: Jeni Tennison [mailto:jeni@jenitennison.com] 
Sent: Friday, October 19, 2001 8: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 13:17:45 UTC