目次へ

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にも属さない要素として認識されます。

↑このページの先頭へ

こちらもチェック!

PR
  • XMLDB.jp