W3C home > Mailing lists > Public > xmlschema-dev@w3.org > March 2002

Re: Derivation by restriction from <any>

From: Jeni Tennison <jeni@jenitennison.com>
Date: Tue, 12 Mar 2002 11:10:07 +0000
Message-ID: <107609629921.20020312111007@jenitennison.com>
To: Simon.Cox@csiro.au
CC: xmlschema-dev@w3.org, dareo@microsoft.com
Hi Simon,

> So after all this, do I understand that: 
> (a) Dare agrees with MSXML that my original schema[1] is invalid; 
> while 
> (b) Jeni originally agreed with Henry that it was OK, but now thinks
> it is unclear
> ?

Yes. I think that it's OK by the spirit of the Rec, but ambiguous by
the letter of the Rec.

> How can I define a base type that will accept *any* elements in its
> content model, and then define a type derived from this by
> restriction that confines the content to a specific vocabulary? (to
> be used for elements in a substitution group)

I think that what you had should work, and it does work with some
schema validators (e.g. Xerces-C++). However, here's a hack that will
get you round the issue...

Declare the basetype and the newtype to be a choice between the model
that you're actually interested in and an element that you'll define
elsewhere. To make this deterministic, the any wildcard and the
element that you use have to have different namespaces - I think that
you want the namespace for the wildcard to be the targetNamespace, so
the following should work:

<xs:import namespace="http://www.example.com/foo"
           schemaLocation="test2.xsd" />

<xs:complexType name="basetype">
  <xs:choice>
    <xs:any maxOccurs="unbounded" namespace="##targetNamespace" />
    <xs:element ref="foo:foo" />
  </xs:choice>
</xs:complexType>

<xs:complexType name="newtype">
  <xs:complexContent>
    <xs:restriction base="my:basetype">
      <xs:choice>
        <xs:sequence>
          <xs:element name="e1" type="xs:string"/>
          <xs:element name="e2" type="xs:integer" minOccurs="0"/>
          <xs:element name="e3" type="xs:date" minOccurs="0"/>
        </xs:sequence>    
        <xs:element ref="foo:foo" />
      </xs:choice>
    </xs:restriction>
  </xs:complexContent>
</xs:complexType>

This way, MSXML recognises that the any wildcard is being restricted
to the sequence of elements, and doesn't complain about the 1 to many
mapping between particles.

Then declare the foo:foo element to be an abstract element in
'test2.xsd' (or whatever), and to block substitution:

<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema"
           targetNamespace="http://www.example.com/foo">

<xs:element name="foo" abstract="true" block="substitution" />

</xs:schema>

This ensures that the foo:foo element can never itself be used in an
instance document, and that it can't be substituted for another
element should someone import your schema.

I tested this with MSXML4 and it validates fine.

Cheers,

Jeni

---
Jeni Tennison
http://www.jenitennison.com/
Received on Tuesday, 12 March 2002 06:10:09 GMT

This archive was generated by hypermail 2.2.0+W3C-0.50 : Tuesday, 11 January 2011 00:14:29 GMT