中の技術日誌ブログ

C#とC++/CLIと
VBと.NETとWindowsで戯れる
 

目次

Blog 利用状況

ニュース

自己紹介

東京でソフトウェアエンジニアをやっています。
お仕事大募集中です。
記事執筆や、講師依頼とかでも何でもどうぞ(*^_^*)
似顔絵 MSMVPロゴ
MSMVP Visual C# Since 2004/04-2013/03

記事カテゴリ

書庫

日記カテゴリ

00-整理

01-MSMVP

XMLってなぁに?初級編の後番外編(XML名前空間について考える)

第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を利用する際に名前空間はきっても切れないものなので、確実に理解してほしい。
次回からは本流に戻って中級編の開始です。

投稿日時 : 2004年11月1日 22:03

コメントを追加

# XMLってなぁに?(初級編)記事にまとめました。 2004/11/01 22:06 中の技術日誌

記事にまとめました。

ぜひ皆さんリンクしてくださいね。

中級編はそろそろ再開します。

タイトル
名前
URL
コメント