Revised: Oct./05th/2003
DTDでは、名前空間をサポートしないので、名前空間と接頭辞(プレフィックス)を利用する XML 文書のスキーマを表現しようとすると、無理が生じます。名前空間を利用する XML 文書の定義は、XML Schemaを利用するとすっきりといきます。XML Schema は 2001年5月にW3Cによって勧告され、Part 0: Primer, Part 1: Structures, Part 2: Datatypeの三つの部分からなる大きな仕様です。リスト4が従うXML Schemaをリスト6に挙げます。XML SchemaもXMLベースのマークアップ言語です。
リスト6. リスト4のXML Schema文書(address.xsd)
<?xml version="1.0" encoding="UTF-8"?>
<schema xmlns="http://www.w3.org/2001/XMLSchema"
xmlns:hlq="urn:address"
targetNamespace="urn:address">
<!--address要素の定義-->
<element name="address">
<complexType>
<!--内容モデルの要素タイプの出現順序の定義-->
<sequence>
<element ref="hlq:item" minOccurs="0" maxOccurs="unbounded"/>
</sequence>
</complexType>
</element>
<!--item要素の定義-->
<element name="item">
<complexType>
<sequence>
<element ref="hlq:name"/>
<element ref="hlq:access" minOccurs="0" maxOccurs="unbounded"/>
<element ref="hlq:image" minOccurs="0" maxOccurs="1"/>
</sequence>
<!--属性の定義-->
<attribute name="sex" use="required">
<simpleType>
<restriction base="string">
<enumeration value="male"/>
<enumeration value="female"/>
</restriction>
</simpleType>
</attribute>
<attribute name="custid" use="required"/>
</complexType>
</element>
<!--内容が文字列で属性を持たないname要素の定義-->
<element name="name" type="string"/>
<!--内容が文字列で属性を持つaccess要素の定義-->
<element name="access">
<complexType>
<simpleContent>
<extension base="string">
<attribute name="kind" type="string"/>
</extension>
</simpleContent>
</complexType>
</element>
<!--空要素であるimage要素の定義-->
<element name="image">
<complexType>
<attribute name="file" type="anyURI" use="required"/>
</complexType>
</element>
</schema>
リスト6はリスト2に比べると膨大な行数が費やされています。一つの理由は、XML SchemaがXML文書であるためです。XML文書では、一般に開始タグと終了タグでマークアップする形式であるため、含まれる情報量に比べてサイズが大きくなります。もう一つの理由は、XML Schemaという仕様が詳細な指定を可能としているためです。XML Schema Part 0: Primerでは、基本的な概念を実例に基づいて端的に説明しているので参照してください。