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

RE: puzzling over use="prohibited"

From: Don Smith <donalds@isogen.com>
Date: Tue, 2 Apr 2002 10:14:27 -0600
To: "Jeni Tennison" <jeni@jenitennison.com>
Cc: "Schema" <xmlschema-dev@w3.org>
Message-ID: <BBENIBDOJAFBJBANPKGAEEKACJAA.donalds@isogen.com>
Hi Jeni,

Thanks. I didn't realize that attributes do inherit through complex type
derivation. That fact provides the answer I was looking for.

Don

-----Original Message-----
From: Jeni Tennison [mailto:jeni@jenitennison.com]
Sent: Tuesday, April 02, 2002 10:12 AM
To: Don Smith
Cc: Schema
Subject: Re: puzzling over use="prohibited"


Hi Don,

> Is use="prohibited" simply a way to "turn off" an attribute
> declaration without deleting it?
>
> That's the only way I can imagine using it. Is there some other way
> or use case I'm missing?

You can use it like that, but it's intended to be used when you
restrict a type. There are several nice examples in the schema for XML
Schema, in fact. For example:

 <xs:complexType name="attribute">
  <xs:complexContent>
   <xs:extension base="xs:annotated">
    <xs:sequence>
     <xs:element name="simpleType" minOccurs="0" type="xs:localSimpleType"/>
    </xs:sequence>
    <xs:attributeGroup ref="xs:defRef"/>
    <xs:attribute name="type" type="xs:QName"/>
    <xs:attribute name="use" use="optional" default="optional">
     <xs:simpleType>
      <xs:restriction base="xs:NMTOKEN">
       <xs:enumeration value="prohibited"/>
       <xs:enumeration value="optional"/>
       <xs:enumeration value="required"/>
      </xs:restriction>
     </xs:simpleType>
    </xs:attribute>
    <xs:attribute name="default" type="xs:string"/>
    <xs:attribute name="fixed" type="xs:string"/>
    <xs:attribute name="form" type="xs:formChoice"/>
   </xs:extension>
  </xs:complexContent>
 </xs:complexType>

 <xs:complexType name="topLevelAttribute">
  <xs:complexContent>
   <xs:restriction base="xs:attribute">
    <xs:sequence>
     <xs:element ref="xs:annotation" minOccurs="0"/>
     <xs:element name="simpleType" minOccurs="0" type="xs:localSimpleType"/>
    </xs:sequence>
    <xs:attribute name="ref" use="prohibited"/>
    <xs:attribute name="form" use="prohibited"/>
    <xs:attribute name="use" use="prohibited"/>
    <xs:attribute name="name" use="required" type="xs:NCName"/>
   </xs:restriction>
  </xs:complexContent>
 </xs:complexType>

By default when you derive a complex type from another complex type,
all the attributes on the base complex type are inherited by the
derived complex type. (This is different from how element content is
inherited, where you have to explicitly specify the content model of
the derived type.)

In the above example, the base type is the xs:attribute type, which
defines a number of attributes -- name, ref, type, use, default, fixed
and form. Top level attributes aren't allowed to have some of these
attributes, however -- they're not allowed to have ref, form or use
attributes. To stop these attributes from being inherited by the
xs:topLevelAttribute type (and hence permitted), they are prohibited
with use="prohibited".

Cheers,

Jeni

---
Jeni Tennison
http://www.jenitennison.com/
Received on Tuesday, 2 April 2002 11:20:01 GMT

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