10.7. Schemas for XML, XML Base and XLink
XML Base, XLink, and XML 1.0 all define vocabularies that are
composed only of attributes. Attributes such as
xml:base, xlink:href, or
xml:lang are designed to work with elements from
any vocabulary, imparting their meaning to those elements and
sometimes the descendants of those elements.
10.7.1. XML Attributes
In
this section, we will discuss
how to allow the use of a XML attribute in our document. To
illustrate this, let's use a xml:lang attribute
to qualify the language of several descriptions in several languages
for our book:
<?xml version="1.0"?>
<library xmlns="http://dyomedea.com/ns/library">
<book id="b0836217462">
<title>
Being a Dog Is a Full-Time Job
</title>
<description xml:lang="en">
Its title says it all !
</description>
<description xml:lang="fr">
Son titre le résume parfaitement !
</description>
</book>
</library>
Following Namespaces in XML 1.0, W3C XML Schema
considers xml:lang, xml:space (from the
XML 1.0 recommendation) and xml:base (from the
XML Base specification) to belong to the XML 1.0
namespace identified by the URI reference
"http://dyomedea.com/ns/people".
TIP:
The XML 1.0 namespace is an exception in
the namespaces world, since we don't need to declare
it in the instance documents. Its
prefix
"xml" is reserved for this usage
and has a special meaning, even for the parsers that do not support
the namespaces. In theory, any other prefix can be assigned to the
XML 1.0 namespace, but this practice is confusing and
shouldn't be encouraged.
To use attributes from this namespace, we will declare the XML
namespace, import a schema, and reference both of them, as
we've done previously for the elements from our
"people" namespace:
<?xml version="1.0"?>
<xs:schema targetNamespace="http://dyomedea.com/ns/library"
elementFormDefault="qualified" attributeFormDefault="unqualified"
xmlns:lib="http://dyomedea.com/ns/library"
xmlns:xs="http://www.w3.org/2001/XMLSchema">
<xs:import namespace="http://www.w3.org/XML/1998/namespace"
schemaLocation="xml.xsd"/>
<xs:element name="description">
<xs:complexType>
<xs:simpleContent>
<xs:restriction base="xs:string">
<xs:attribute ref="xml:lang"/>
</xs:restriction>
</xs:simpleContent>
</xs:complexType>
</xs:element>
<xs:element name="library">
<xs:complexType>
<xs:sequence>
<xs:element ref="lib:book"/>
</xs:sequence>
</xs:complexType>
</xs:element>
<xs:element name="book">
<xs:complexType>
<xs:sequence>
<xs:element name="title" type="xs:string"/>
<xs:element ref="lib:description" maxOccurs="unbounded"/>
</xs:sequence>
<xs:attribute name="id" type="xs:ID" use="required"/>
</xs:complexType>
</xs:element>
</xs:schema>
In this example, we import a local schema
(xml.xsd) for the XML namespace. The
W3C has defined its own schema for the
xml:lang, xml:space, and
xml:base attributes. This is available at
http://www.w3.org/2001/xml.xsd:
<?xml version='1.0'?>
<!DOCTYPE xs:schema PUBLIC "-//W3C//DTD XMLSCHEMA 200102//EN" "XMLSchema.dtd" >
<xs:schema targetNamespace="http://www.w3.org/XML/1998/namespace" xmlns:xs="http://
www.w3.org/2001/XMLSchema" xml:lang="en">
<xs:annotation>
<xs:documentation>
See http://www.w3.org/XML/1998/namespace.html and
http://www.w3.org/TR/REC-xml for information about this namespace.
</xs:documentation>
</xs:annotation>
<xs:annotation>
<xs:documentation>This schema defines attributes and an attribute group
suitable for use by
schemas wishing to allow xml:base, xml:lang or xml:space attributes
on elements they define.
To enable this, such a schema must import this schema
for the XML namespace, e.g. as follows:
<schema . . .>
. . .
<import namespace="http://www.w3.org/XML/1998/namespace"
schemaLocation="http://www.w3.org/2001/03/xml.xsd"/>
Subsequently, qualified reference to any of the attributes
or the group defined below will have the desired effect, e.g.
<type . . .>
. . .
<attributeGroup ref="xml:specialAttrs"/>
will define a type which will schema-validate an instance
element with any of those attributes</xs:documentation>
</xs:annotation>
<xs:annotation>
<xs:documentation>In keeping with the XML Schema WG's standard versioning
policy, this schema document will persist at
http://www.w3.org/2001/03/xml.xsd.
At the date of issue it can also be found at
http://www.w3.org/2001/xml.xsd.
The schema document at that URI may however change in the future,
in order to remain compatible with the latest version of XML Schema
itself. In other words, if the XML Schema namespace changes, the version
of this document at
http://www.w3.org/2001/xml.xsd will change
accordingly; the version at
http://www.w3.org/2001/03/xml.xsd will not change.
</xs:documentation>
</xs:annotation>
<xs:attribute name="lang" type="xs:language">
<xs:annotation>
<xs:documentation>In due course, we should install the relevant ISO 2- and 3-letter
codes as the enumerated possible values . . .</xs:documentation>
</xs:annotation>
</xs:attribute>
<xs:attribute name="space" default="preserve">
<xs:simpleType>
<xs:restriction base="xs:NCName">
<xs:enumeration value="default"/>
<xs:enumeration value="preserve"/>
</xs:restriction>
</xs:simpleType>
</xs:attribute>
<xs:attribute name="base" type="xs:anyURI">
<xs:annotation>
<xs:documentation>See http://www.w3.org/TR/xmlbase/ for
information about this attribute.</xs:documentation>
</xs:annotation>
</xs:attribute>
<xs:attributeGroup name="specialAttrs">
<xs:attribute ref="xml:base"/>
<xs:attribute ref="xml:lang"/>
<xs:attribute ref="xml:space"/>
</xs:attributeGroup>
</xs:schema>
TIP:
Among the many controversial issues surrounding the usage of
URIs, the decision to use a
schema at its original location (on the W3C web
site) versus using a local copy is not easy. Using a schema at its
original location provides a guarantee of always accessing the most
recent version, but this can be a problem if the schema becomes out
of sync with the applications using it. It can also impact the
ability to process documents when the hosting site is unreachable and
may open a possibility of malicious substitutions
of
schemas.
10.7.2. XLink Attributes
To illustrate the usage of
XLink
attributes, we can replace the definition of the author that is
currently within the description of a book under the
authors element, with a reference to an author
described as a "person" in another
XML document:
<?xml version="1.0"?>
<library xmlns="http://dyomedea.com/ns/library"
xmlns:xlink="http://www.w3.org/1999/xlink">
<book id="b0836217462">
<title>
Being a Dog Is a Full-Time Job
</title>
<authors>
<person xlink:href="authors.xml#CMS"/>
</authors>
</book>
</library>
Again, we need to define the namespace for XLink and to import a
schema before referencing the XLink attributes:
<?xml version="1.0"?>
<xs:schema targetNamespace="http://dyomedea.com/ns/library"
elementFormDefault="qualified" attributeFormDefault="unqualified"
xmlns:xs="http://www.w3.org/2001/XMLSchema"
xmlns:xlink="http://www.w3.org/1999/xlink"
xmlns:lib="http://dyomedea.com/ns/library">
<xs:import namespace="http://www.w3.org/1999/xlink"
schemaLocation="xlink.xsd"/>
<xs:element name="person">
<xs:complexType>
<xs:attribute ref="xlink:href" use="required"/>
<xs:attribute ref="xlink:type" fixed="simple"/>
<xs:attribute ref="xlink:show" fixed="embed"/>
<xs:attribute ref="xlink:actuate" fixed="onLoad"/>
</xs:complexType>
</xs:element>
<xs:element name="library">
<xs:complexType>
<xs:sequence>
<xs:element ref="lib:book"/>
</xs:sequence>
</xs:complexType>
</xs:element>
<xs:element name="book">
<xs:complexType>
<xs:sequence>
<xs:element name="title" type="xs:string"/>
<xs:element ref="lib:authors"/>
</xs:sequence>
<xs:attribute name="id" type="xs:ID" use="required"/>
</xs:complexType>
</xs:element>
<xs:element name="authors">
<xs:complexType>
<xs:sequence>
<xs:element ref="lib:person"/>
</xs:sequence>
</xs:complexType>
</xs:element>
</xs:schema>
TIP:
Following the suggestion of the XLink specification, we have defined
additional XLink attributes (type,
show, and actuate) as fixed
values. While this is legitimate, one should note that these values
are only available to the applications that use a W3C XML
Schema post-schema validation infoset
(PSVI).
Although the XLink specification doesn't provide a
schema, creating the parts we need is very straightforward:
<?xml version="1.0"?>
<xs:schema targetNamespace="http://www.w3.org/1999/xlink"
elementFormDefault="qualified" attributeFormDefault="qualified"
xmlns:xs="http://www.w3.org/2001/XMLSchema"
xmlns:xlink="http://www.w3.org/1999/xlink">
<xs:attribute name="type">
<xs:simpleType>
<xs:restriction base="xs:NMTOKEN">
<xs:enumeration value="simple"/>
<xs:enumeration value="extended"/>
<xs:enumeration value="locator"/>
<xs:enumeration value="arc"/>
<xs:enumeration value="resource"/>
<xs:enumeration value="title"/>
</xs:restriction>
</xs:simpleType>
</xs:attribute>
<xs:attribute name="href" type="xs:anyURI"/>
<xs:attribute name="role" type="xs:anyURI"/>
<xs:attribute name="arcrole" type="xs:anyURI"/>
<xs:attribute name="title" type="xs:string"/>
<xs:attribute name="show">
<xs:simpleType>
<xs:restriction base="xs:NMTOKEN">
<xs:enumeration value="new"/>
<xs:enumeration value="replace"/>
<xs:enumeration value="embed"/>
<xs:enumeration value="other"/>
<xs:enumeration value="none"/>
</xs:restriction>
</xs:simpleType>
</xs:attribute>
<xs:attribute name="label" type="xs:NMTOKEN"/>
<xs:attribute name="actuate">
<xs:simpleType>
<xs:restriction base="xs:NMTOKEN">
<xs:enumeration value="onLoad"/>
<xs:enumeration value="onRequest"/>
<xs:enumeration value="other"/>
<xs:enumeration value="none"/>
</xs:restriction>
</xs:simpleType>
</xs:attribute>
<xs:attribute name="from" type="xs:NMTOKEN"/>
<xs:attribute name="to" type="xs:NMTOKEN"/>
</xs:schema>
 |  |  | | 10.6. Referencing Other Namespaces |  | 10.8. Namespace Behavior of Imported Components |
Copyright © 2002 O'Reilly & Associates. All rights reserved.
|
|