- 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接頭辞により設定する必要があります。