XML名前空間(XML namespace)とはなにかをちょっと掘り下げて考えてみたい。
まず名前空間という概念が出てきた経緯を考えてみたい。
名前空間という言葉が定義されたのはいつかはわからないが、たとえばOpenという関数名を考えてみる。
単純にOpenという関数名があって新しくOpenする何かを定義する時にOpenxxx, Openyyyなどと関数名を区別しなくてはいけない時に、Windows APIではSH****だとかをプレフィックスに持つ関数名が増えている。
同じ関数名があった時に悲惨な事態になるからである。
何故悲惨になるかというと、Open()という関数が2つあった場合に区別が出来ないからで、区別さえ出来ればいいということになる。
--------------------------------------------------------------------------------
名前空間とは名前を識別する空間を制限しましょうということで、たとえば街に一人しかAさんがいなければAと呼べば皆Aさんのことはわかります。
ただAさんがここにもう一人入ってくると(A'さん)、AさんとA'さんの区別が付かなくなります。
きいちご林のAさんとか、緑の丘のAさんといえばどちらのAさんか特定できるようになります。
この"きいちご林の"とか"緑の丘の"と、Aさんの活動範囲(ここでは居住地域)を制限しているこのこと自体が名前空間という概念ということになります。
--------------------------------------------------------------------------------
さてXMLとXSLを利用する場合の名前空間とはどういう扱いなのでしょうか?
基本的なところは一切変わりません。
<A>
<B />
</A>
このようなタグ構造があったとします。
この<A>や<B>はHTMLにある"それ"をさしているのか、それとも独自の意味を持ったタグかはそのままではわかりかねます。
だから、これは独自の意味のタグだという名前空間を宣言してあげるわけです。
<A xmlns="http://www.example.com/dokuji">
<B />
</A>
これでここに出てくる<A><B>はhttp://www.example.com/dokujiという名前が与えられました。
これでHTMLの<A><B>と混同することはなくなりました。
上記のタグの名前空間を分解してみると以下のようなイメージになります。
<http://www.example.com/dokuji_A>
<http://www.example.com/dokuji_B />
</http://www.example.com/dokuji_A>
では
<dokuji:A xmlns:dokuji="http://www.example.com/dokuji">
<dokuji:B />
</dokuji:A>
このXMLは展開した場合にどのように解釈されるのでしょうか?
そうです。先ほどの答えと同じ
<http://www.example.com/dokuji_A>
<http://www.example.com/dokuji_B />
</http://www.example.com/dokuji_A>
になります。
xmlns:xxx この右のxxxをQualified Names(修飾名)といいますが、この修飾名を使う/使わないはXML的に見た場合にはどうでもいいということです。
--------------------------------------------------------------------------------
XSLやプログラムから見た場合の動きは次回取り上げます。
仕様書はとてもとても短い仕様書ですが、実はとても重要な機能です。
ま、こんなんだ位見渡しておくといいかも知れません。
参考
Namespace in XML
http://www.w3.org/TR/REC-xml-names/
XML名前空間(翻訳版)
http://www.doraneko.org/xml/namespace10/19990114/Overview.html