- 7.1 Namespaceの意義
- 7.2 Namespaceの定義
- 7.3 要素とNamespace
- 7.4 属性とNamespace
- 7.5 DTDとNamespaceの問題
- 7.6 まとめ
7.3 要素とNamespace
各要素や属性がどのNamespaceに属しているのか指定する方法について、もう少し詳しく見ていきましょう。この章では、要素のNamespace指定について見ていきます。既に見てきたように、Namespaceの指定の方法として、Namespace接頭辞を使用する方法があります。以下に例を示します。
<?xml version="1.0"?> <!-- all elements here are explicitly in the HTML namespace --> <html:html xmlns:html="http://www.w3.org/TR/REC-html40"> <html:head> <html:title>Frobnostication</html:title> </html:head> <html:body> <html:p>Moved to <html:a href="http://frob.com">here.</html:a></html:p> </html:body> </html:html>
上の例では、すべての要素が"http://www.w3.org/TR/REC-html40"により参照可能なNamespaceに属していることが示されています。Namespace接頭辞を使用するには、その要素かその要素の祖先要素(親要素、または親の親要素、または...)の属性で、Namespace接頭辞が定義されていなければなりません。以下の例は、エラーになります。
<?xml version="1.0"?> <!-- all elements here are explicitly in the HTML namespace --> <html> <html:head xmlns:html="http://www.w3.org/TR/REC-html40"> <html:title>Frobnostication</html:title> </html:head> <html:body> <html:p>Moved to <html:a href="http://frob.com">here.</html:a></html:p> </html:body> </html>
上の例では、bodyの親要素はhtmlのみですが、html要素でもbody要素でもNamespace接頭辞の宣言がなされていません。そのため、html Namespace接頭辞は使用できません。
また、ひとつの要素内で複数のNamespace接頭辞を宣言することもできます。以下に例を示します。
<?xml version="1.0"?> <!-- both namespace prefixes are available throughout --> <bk:book xmlns:bk="urn:loc.gov:books" xmlns:isbn="urn:ISBN:0-395-36341-6"> <bk:title>Cheaper by the Dozen</bk:title> <isbn:number>1568491379</isbn:number> </bk:book>
要素のNamespaceを記述するもうひとつの方法が、デフォルトNamespaceを指定する方法です。デフォルトNamespaceは属性値で宣言します。
< 要素名 xmlns=" デフォルトNamespaceのURI"/>
以上のように宣言した場合、Namespaceの指定がない子供要素、孫要素はデフォルトNamespaceに属するものと認識されます。以下に例を示します。
<?xml version="1.0"?> <!-- all elements here are explicitly in the HTML namespace --> <html xmlns="http://www.w3.org/TR/REC-html40"> <head> <title>Frobnostication</title> </head> <body> <p>Moved to <a href="http://frob.com">here.</a></p> </body> </html>
上の文書では、ルート要素であるhtml要素で、デフォルトNamespace"http://www.w3.org/TR.REC-html40"が指定されています。またルート要素および、子孫要素にはNamespaceの指定がされていません。そのため、上記文中の要素はすべてNamespace"http://www.w3.org/TR.REC-html40"に属すると認識されます。もうひとつ例を示します。
<?xml version="1.0"?> <!-- unprefixed element types are from "books" --> <book xmlns='urn:loc.gov:books' xmlns:isbn='urn:ISBN:0-395-36341-6'> <title>Cheaper by the Dozen</title> <isbn:number>1568491379</isbn:number> </book>
上の文書では、デフォルトNamespaceとして"urn:loc.gov:books"を指定したうえで、Namespace接頭辞isbnを指定しています。これにより、book要素とtitle要素はNamespace"urn:loc.gov:books"に属し、number要素はNamespace"urn:ISBN:0-395-36341-6"に属していることがわかります。
ところで、デフォルトNamespaceの有効範囲には注意が必要です。
<Beers> <!-- the default namespace is now that of HTML --> <table xmlns="http://www.w3.org/TR/REC-html40"> <th> <td>Name</td> <td>Origin</td> <td>Description</td> </th> <tr> <!-- no default namespace inside table cells --> <td><brandName xmlns="">Huntsman</brandName></td> <td><origin xmlns="">Bath, UK</origin></td> <td> <details xmlns=""> <class>Bitter</class> <hop>Fuggles</hop> <pro>Wonderful hop, light alcohol, good summer beer</pro> <con>Fragile; excessive variance pub to pub</con> </details> </td> </tr> </table> </Beers>
上の例では、ルート要素でデフォルトNamespaceとしてhtmlを指定しています。しかし、その中のXML文章の中で、デフォルトNamespaceを空文字列に設定しています。これにより、上記の文字が緑色の部分は、どこのNamespaceにも属さない要素として認識されます。