- 9.1 Global とLocal
- 9.2 XML 文書内のNamespace指定
- 9.3 名前の衝突
- 9.4 qualify、unqualify
- 9.5 まとめ
9.2 XML 文書内のNamespace指定
Target Namespaceを持つXML Schemaに沿った文書を記述する場合、要素や属性がどのNamespaceに属するのか、意識することが非常に重要です。しかし、XML Schemaの厄介なところは、Namespaceを指定しなければいけない要素、属性と、指定してはいけない要素、属性があることです。指定するかしないかは、その要素や属性がGlobalなのか、Localなのかに、深く関わっています。
まず、Globalなものです。Global要素やGlobal属性は、必ず、そのNamespaceを指定する必要があります。Global要素の場合、Namespaceを指定する方法にはデフォルトNamespaceを使用する方法と、Namespace接頭辞を使用する方法があります。Global属性の場合は、Namespace接頭辞によりのみ指定できます。デフォルトNamespaceを使用して指定できるのは、要素のNamespaceのみだからです。
以下に例を示します。
次に、Localなものです。Local要素や、Local属性に関して、Namespaceを特定するかしないかは、XML Schema文書に定められています。それは、schema要素のelementFormDefault属性および、attributeFormDefault属性です。
<schema targetNamespace="本文書で定義している言語のNamespaceのURI"
elementFormDefault="Local要素のNamespaceを指定するかどうか"
attributeFormDefault="Local属性のNamespaceを指定するかどうか">
...
</schema>
elementFormDefault、attributeFormDefaultの属性値は、qualifiedかunqualified、どちらかを指定します。qualifiedを指定した場合、Local要素もしくは属性のNamespaceを特定しなければいけません。unqualifiedを指定した場合は、Local要素、もしくは属性のNamespaceを特定してはいけません。デフォルトの値は、unqualifiedです。
例えば、以下のXML Schemaがあったとします。
<?xml version="1.0"?>
<schema xmlns="http://www.w3.org/2001/XMLSchema"
targetNamespace="http://www.example.com/PO1"
xmlns:po="http://www.example.com/PO1"
elementFormDefault="unqualified"
attributeFormDefault="unqualified">
<element name="purchaseOrder" type="po:PurchaseOrderType"/>
<element name="comment" type="string"/>
<complexType name="PurchaseOrderType">
<sequence>
<element name="shipTo" type="po:USAddress"/>
<elemanet name="billTo" type="po:USAddress"/>
<element ref="po:comment" minOccurs="0"/>
<!-- etc -->
</sequence>
<attribute name="orderDate" type="date">
</complexType>
<complexType name="USAddress”>
<sequence>
<element name"name" type="string" />
<element name="street" type="string"/>
</sequence>
</complexType>
<!-- etc -->
</schema>
上の文書では、elementFormDefault属性も、attributeFormDefault属性もunqualifiedに設定されています。これより、shipTo、name等のLocal要素のNamespaceは特定されていない必要があります。上のスキーマに沿った文書を以下に記述します。
<?xml version="1.0"?>
<apo:purchaseOrder xmlns:apo="http://www.example.com/PO1"
orderDate="1999-10-20>
<shipTo>
<name>Alice Smith</name>
<street>123 Maple Street</street>
<!--- etc. --->
</shipTo>
<billTo coutry="US">
<name>Robert Smith</name>
<street>8 Oak Avenue</street>
</billTo>
<apo:comment>Hurry,my lawn is going wild!</apo:comment>
<!-- etc -->
</apo:purchaseOrder>
Global要素要素のpurchaseOrder、commentには、Namespace接頭辞がついています。Global要素は、必ず、Namespace接頭辞をつけるか、デフォルトNamespaceを指定して、Namespaceを特定する必要があります.しかし、他の要素はLocal要素なので、Namespace接頭辞はついていません。elementFormDefaultがunqualifiedに設定されているため、Local要素にはNamespace接頭辞をつけてはいけないのです。注意しなければいけないのは、以下の文書がエラーになるということです。
<?xml version="1.0"?>
<purchaseOrder xmlns="http://www.example.com/PO1"
orderDate="1999-10-20>
<shipTo>
<name>Alice Smith</name>
<street>123 Maple Street</street>
<!--- etc. --->
</shipTo>
<billTo coutry="US">
<name>Robert Smith</name>
<street>8 Oak Avenue</street>
</billTo>
<comment>Hurry,my lawn is going wild!</comment>
<!-- etc -->
</purchaseOrder>
以上の文書には、デフォルトNamespaceが設定が記述されています。これにより、shipTo、name等の要素のNamespaceは"http://www.example.com/PO1"に指定されていることになります。これは、elementFormDefaultのunqualified指定に反します。よって、エラーになります。
逆に、Local要素もLocal属性も、Namespaceを指定しなければいけないように設定します。
<?xml version="1.0"?>
<schema xmlns="http://www.w3.org/2001/XMLSchema"
targetNamespace="http://www.example.com/PO1"
xmlns:po="http://www.example.com/PO1"
elementFormDefault="qualified"
attributeFormDefault="qualified">
<element name="purchaseOrder" type="po:PurchaseOrderType"/>
<element name="comment" type="string"/>
<complexType name="PurchaseOrderType">
<sequence>
<element name="shipTo" type="po:USAddress"/>
<element name="billTo" type="po:USAddress"/>
<element ref="po:comment" minOccurs="0"/>
<!-- etc -->
</sequence>
<attribute name="orderDate" type="date">
</complexType>
<complexType name="USAddress”>
<sequence>
<element name"name" type="string" />
<element name="street" type="string"/>
</sequence>
</complexType>
<!-- etc -->
</schema>
すると、以下のように、すべての要素、属性のNamespaceを記述する必要があります。
<?xml version="1.0"?>
<apo:purchaseOrder xmlns:apo="http://www.example.com/PO1"
apo:orderDate="1999-10-20>
<apo:shipTo>
<apo:name>Alice Smith</apo:name>
<apo:street>123 Maple Street</apo:street>
<!--- etc. --->
</apo:shipTo>
<apo:billTo >
<apo:name>Robert Smith</name>
<apo:street>8 Oak Avenue</apo:street>
</apo:billTo>
<apo:comment>Hurry,my lawn is going wild!</apo:comment>
<!-- etc -->
</apo:purchaseOrder>
デフォルトNamespaceを使用して記述すれば以下のようになります。
<?xml version="1.0"?>
<purchaseOrder xmlns="http://www.example.com/PO1"
xmlns:apo="http://www.example.com/PO1"
apo:orderDate="1999-10-20>
<shipTo>
<name>Alice Smith</name>
<street>123 Maple Street</street>
<!--- etc. --->
</shipTo>
<billTo coutry="US">
<name>Robert Smith</name>
<street>8 Oak Avenue</street>
</billTo>
<comment>Hurry,my lawn is going wild!</comment>
<!-- etc -->
</purchaseOrder>
orderDate属性には、Namespace接頭辞が記述してあることに注意してください。デフォルトNamespaceで、指定しているのは、要素のNamespaceのみです。属性のNamespaceはNamespace接頭辞により設定する必要があります。

