第1回
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
第2回
さーて前回はXMLの中での名前空間の扱いをしらべた。
こういうXMLを考えよう。
<A><B>Bの中身</B></A>
このXMLをvalue-ofすることを考えてみよう。
<xsl:value-of select="/A/B" />
これでBの中身にアクセスできる。
では名前空間定義済みの場合にはどうなるのであろうか。
<A xmlns="http://www.example.com/tatoeba">
<B>Bの中身</B>
</A>
<xsl:value-of select="/A/B" xmlns="http://www.example.com/tatoeba" />
上記のXMLとXSLの組み合わせを展開してみよう。
<http://www.example.com/tatoeba_A>
<http://www.example.com/tatoeba_B>Bの中身
</http://www.example.com/tatoeba_B>
</http://www.example.com/tatoeba_A>
<xsl:value-of select="/A/B" />
XMLの方は想像したとおりに展開されるのに、XSLのほうには展開されていない。
XSLもXML文書であるという点を考えてほしい。
以下のようなXSLが合ったとしよう。
<xsl:value-of select="/A/B" xmlns="http://www.example.com/tatoeba">
<A />
</xsl:value-of>
このようなXSLであれば
<xsl:value-of select="/A/B">
<http://www.example.com/tatoeba_A />
</xsl:value-of>
このように展開されるものだろう。
なぜXSL命令の中で展開されないのかを考えると、実は1つの結論しか出てこない。
名前空間なしXMLに対してアクセスする方法がなくなってしまうからだ。
名前空間のないシンプルなXMLが合った場合にアクセスできないのではXSLは大きな欠陥呼ばわりされてしまう事間違いなしである。
なのでXSL(プログラムでも同様)で名前空間を定義したXMLを操作する場合には
<xsl:value-of select="/the:A/the:B" xmlns:the="http://www.example.com/tatoeba">
<A />
</xsl:value-of>
と利用する。
わかっていただけただろうか。
XMLを利用する際に名前空間はきっても切れないものなので、確実に理解してほしい。
次回からは本流に戻って中級編の開始です。