4.1 A Schema in Multiple DocumentsA Schema in Multiple Documents
As schemas become larger, it is often desirable to divide
their content among several schema documents for purposes
such as ease of maintenance, access control, and
readability. For these reasons, we have taken the schema
constructs concerning addresses out of po.xsd, and put them in a new file
called address.xsd.
The modified purchase order schema file is called ipo.xsd:
NOTE:
The International Purchase Order Schema, ipo.xsd
<schema targetNamespace="http://www.example.com/IPO"
xmlns="http://www.w3.org/2001/XMLSchema"
xmlns:ipo="http://www.example.com/IPO">
<annotation>
<documentation xml:lang="en">
International Purchase order schema for Example.com
Copyright 2000 Example.com. All rights reserved.
</documentation>
</annotation>
<!-- include address constructs -->
<include
schemaLocation="http://www.example.com/schemas/address.xsd"/>
<element name="purchaseOrder" type="ipo:PurchaseOrderType"/>
<element name="comment" type="string"/>
<complexType name="PurchaseOrderType">
<sequence>
<element name="shipTo" type="ipo:Address"/>
<element name="billTo" type="ipo:Address"/>
<element ref="ipo:comment" minOccurs="0"/>
<element name="items" type="ipo:Items"/>
</sequence>
<attribute name="orderDate" type="date"/>
</complexType>
<complexType name="Items">
<sequence>
<element name="item" minOccurs="0" maxOccurs="unbounded">
<complexType>
<sequence>
<element name="productName" type="string"/>
<element name="quantity">
<simpleType>
<restriction base="positiveInteger">
<maxExclusive value="100"/>
</restriction>
</simpleType>
</element>
<element name="USPrice" type="decimal"/>
<element ref="ipo:comment" minOccurs="0"/>
<element name="shipDate" type="date" minOccurs="0"/>
</sequence>
<attribute name="partNum" type="ipo:SKU" use="required"/>
</complexType>
</element>
</sequence>
</complexType>
<simpleType name="SKU">
<restriction base="string">
<pattern value="\d{3}-[A-Z]{2}"/>
</restriction>
</simpleType>
</schema>
The file containing the address constructs is:
NOTE:
Addresses for International Purchase Order schema, address.xsd
<schema targetNamespace="http://www.example.com/IPO"
xmlns="http://www.w3.org/2001/XMLSchema"
xmlns:ipo="http://www.example.com/IPO">
<annotation>
<documentation xml:lang="en">
Addresses for International Purchase order schema
Copyright 2000 Example.com. All rights reserved.
</documentation>
</annotation>
<complexType name="Address">
<sequence>
<element name="name" type="string"/>
<element name="street" type="string"/>
<element name="city" type="string"/>
</sequence>
</complexType>
<complexType name="USAddress">
<complexContent>
<extension base="ipo:Address">
<sequence>
<element name="state" type="ipo:USState"/>
<element name="zip" type="positiveInteger"/>
</sequence>
</extension>
</complexContent>
</complexType>
<complexType name="UKAddress">
<complexContent>
<extension base="ipo:Address">
<sequence>
<element name="postcode" type="ipo:UKPostcode"/>
</sequence>
<attribute name="exportCode" type="positiveInteger" fixed="1"/>
</extension>
</complexContent>
</complexType>
<!-- other Address derivations for more countries -->
<simpleType name="USState">
<restriction base="string">
<enumeration value="AK"/>
<enumeration value="AL"/>
<enumeration value="AR"/>
<!-- and so on ... -->
</restriction>
</simpleType>
<!-- simple type definition for UKPostcode -->
</schema>
ref23The various purchase order and
address constructions are now contained in two schema
files, ipo.xsd and
address.xsd. To
include these constructions as part of the international
purchase order schema, in other words to include them in
the international purchase order's namespace, ipo.xsd contains the include element:
NOTE:
<include schemaLocation="http://www.example.com/schemas/address.xsd"/>
The effect of this
include element is to bring in the definitions
and declarations contained in
address.xsd, and make them available as part of
the international purchase order schema target namespace.
The one important caveat to using include is that the target
namespace of the included components must be the same as
the target namespace of the including schema, in this case
http://www.example.com/IPO. Bringing in
definitions and declarations using the include mechanism
effectively adds these components to the existing target
namespace. In [Redefining Types & Groups], we
describe a similar mechanism that enables you to modify
certain components when they are brought in.
In our example, we have shown only one including document
and one included document. In practice it is possible to
include more than one document using multiple include elements, and
documents can include documents that themselves include
other documents. However, nesting documents in this manner
is legal only if all the
included parts of the schema are declared with the same
target namespace.
Instance documents that conform to schema whose
definitions span multiple schema documents need only
reference the 'topmost' document and the common namespace,
and it is the responsibility of the processor to gather
together all the definitions specified in the various
included documents. In our example above, the instance
document ipo.xml (see
[Using Derived Types in Instance Documents]) references
only the common target namespace,
http://www.example.com/IPO, and (by implication) the one schema file
http://www.example.com/schemas/ipo.xsd. The
processor is responsible for obtaining the schema file
address.xsd.
In [Importing Types] we describe how
schemas can be used to validate content from more than one
namespace.
|