XMLを使っていると、複数のスキーマを混在させて使用したい場面は少なくない。たとえば以下はオンラインソフトのデータをXML形式で保存するために作成したスキーマである。このexplanation(説明)タグの中で表やリストを使いたいといったとき、このスキーマのために表を表現するタグを用意するのは面倒くさい。せっかくXHTMLで表を記述するためのタグが定義されているのだから、それを使い回したほうが効率的だろう。
<?xml version="1.0" encoding="Shift_JIS"?> <soft> <title>スーパー画像ビューア</title> <author>山田太郎</author> <dl>http://www.fugafuga.com/</dl> <explanation> <p> 強力な機能をそろえた画像ビューア </p> <p>対応する主な画像形式</p> <dl> <dt>BMP</dt> <dd>Windowsの標準フォーマット</dd> <dt>PICT</dt> <dd>Macintoshの標準フォーマット</dd> <dt>JPEG</dt> <dd>デジタルカメラで広く使われるフォーマット</dd> </dl> </explanation> </soft>
しかし、ここで注意したいのが<dl>というタグが2つ出てきている点だ。1つはソフトウェアのダウンロード先を示すURLを記述したタグで、<explanation>タグの中にある<dl>タグは用語と定義を表わすHTMLのタグである。また<title>というタグも、HTMLのタグとして定義されている。
意味は違うが名前が同じタグが1つのXML文書の中で複数現われてしまうと、そのXMLを処理するソフトウェアは、そのタグがどの意味で使われているのかを解釈する手だてがない。この例であれば、<dl>というタグが現われたとき、ソフトウェアはその<dl>タグがダウンロード先を表わしているのか、それとも定義リストのタグとして用いられているのか判断が難しい。そこで用意されたのが「Namespaces in XML(名前空間)」という規格である。
人の名前でも、同姓同名というのはそれほど珍しくない。たとえばある教室で「山田太郎」君が2人いた場合、名前のほかに出席番号などその人しか持たない一意な情報も利用して判断することで、同じ山田太郎君でもそれぞれを区別することができる。XMLの名前空間も基本的には同様の仕組みで、タグの名前とそれ以外の情報を使って、そのタグがどのスキーマに属しているのかを判断する仕組みを提供している。
名前空間の中で、一意の情報として利用されるのがURIである。URIが便利なのは、多くの人が自分だけのURLを持っていること。ドメインを登録している人はもちろん、それ以外の人でもプロバイダに入会すればホームページ用のスペースを公開するURLが得られる。このURIと作成したスキーマを結びつければ、ほかのスキーマの同じ名前のタグがあっても、URIを使ってそれぞれをしっかりと区別することができる。
このURIとタグを結びつける方法として用意されているのが、「プリフィックス(接頭辞)」と「デフォルトネームスペース」である。プリフィックスはXML文書中で、ある文字列とURIを関連付け、それぞれのタグには接頭辞だけを記述するという方法だ。その後、それぞれのタグを記述する際に同時にプリフィックスも書いておけば、XML文書を処理するソフトウェアが自動的にプリフィックスをURIに展開してくれる。
プリフィックスとURIを関連付ける方法は、そのURIに属するスキーマを下位ノードとして持っているタグに「xmlns:プリフィックス="URI"」という書式の属性を書き加える。こうして関連付けたプリフィックスは、「<プリフィックス:タグの名前>」という書式で利用する。まずプリフィックスを書き、「:(コロン)」に続けてタグの名前を書くわけだ。以下のようなXMLの場合、aというプリフィックスにhttp://www.hogehoge.com/とい うURIが関連付けされ、「a」というプリフィックスを持つすべてのタグは、http://www.hogehoge.com/というURIの名前空間に属することになる。
<a:soft xmlns:a="http://www.hogehoge.com/"> <a:title>スーパー画像ビューア</a:title> <a:author>山田太郎<a:author> <a:dl>http://www.fugafuga.com/</a:dl> <a:explanation>強力な機能をそろえた画像ビューア</a:explanation> </a:soft>
XML文書中で使用するスキーマは1つだが、名前空間を設定しなければならないというような場面では、デフォルトネームスペースを使って宣言するほうが楽だ。これはネームスペースを宣言したノード以下の、名前空間が付加されていないタグはすべてデフォルトネームスペースとして宣言した名前空間に属するというもの。デフォルトネームスペースの宣言の方法は、「xmlns="http://www.hogehoge.com/」のように記述する。つまりプリフィックスの指定をなくしたものと思えばいい。具体的には下記のサンプルのように記述すると、softタグより下位のノードのタグは、すべてhttp://www.hogehoge.com/に属していることになる。
<soft xmlns="http://www.hogehoge.com/"> <title>スーパー画像ビューア</title> <author>山田太郎<author> <dl>http://www.fugafuga.com/</dl> <explanation>強力な機能をそろえた画像ビューア</explanation> </soft>
なおデフォルトネームスペースは、複数宣言することもできる。この場合、階層で見てもっとも近い上位ノードのデフォルトネームスペースの宣言がそのタグのネームスペースと判断される。下記のサンプルの場合、<p>タグと<span>タグは、<p>タグで宣言されているデフォルトネームスペース(http://www.w3.org/1999/xhtml)に属することになる。
<soft xmlns="http://www.hogehoge.com/"> <title>スーパー画像ビューア</title> <author>山田太郎<author> <dl>http://www.fugafuga.com/</dl> <explanation><p xmlns="http://www.w3.org/1999/xhtml"><span style="color : red">強力</span>な機能をそろえた画像ビューア</p></explanation> </soft>