2003年1月19日(日)更新 |
■名前空間
さらら: それぞれの人が作る要素の名前の衝突が起きないようにするって。どうするの?? たけち: そうだね。というところで、まずは、次のXMLデータを見てみようね。 |
※XMLデータ例: 万葉歌と解説-1【kaisetsuNS.xml】 ※XMLデータ例: 万葉歌解説-2【manyouPoemNS.xml】 ※XMLデータ例: 万葉歌解説-3【kaiwaNS.xml】 |
さらら: あ、思い出した! 以前も、たけちはこんな話をしてくれたわよね。 たけち: 思い出してくれた?(^^) ここで何をしているかというと、要素と属性の集まり、つまりスキーマをいくつかのグループに分けて扱っているんだ。 |
mp | : | 万葉集の歌を表現するためのスキーマ |
kaisetsu | : | 歌を解説する文書のためのスキーマ |
kaiwa | : | 会話の文書のためのスキーマ |
xh | : | XHTMLのスキーマ |
たけち: こういうふうに要素と属性の集まり、つまりスキーマをグループ分けして扱って、それを組み合わせることによってXMLデータを作ろう、という考え方をするんだね。このグループのことを名前空間と呼ぶんだよ。 さらら: ふ〜ん。 たけち: こういうふうにすると、次のような利点があるんだよ。 |
名前空間ごとに同じ名前の要素があっても、それぞれは別の要素として扱われるため、参照される名前空間の要素すべてがわかっていなてくも、参照する側では別の名前空間として、それを気にすることなく自由に名前をつけることができる。 |
■名前空間と名前空間接頭辞
さらら: へぇ〜。 たけち: 名前空間というのは、一種の「家」「家族」みたいなものだよね。こっちの家には、鈴木太郎さんと鈴木花子さん夫婦の子供として鈴木一郎さんと鈴木二郎さんがいる。あっちの家にも鈴木一郎さんがいる。でも、こっちの家の鈴木一郎さんとあっちの家の鈴木一郎さんは、同姓同名の別人なんだよね。それを家ごとに分けて区別しているようなものだね。 さらら: そうそう「名前空間」と言ったのよね。。。。。こんな使い方をするのね。で、このmpとかkaisetsuとかxhというのが「名前空間」なのよね。 たけち: あ、それは厳密には違っていて(^^;) mpとかkaisetsuとかxhというのは名前空間接頭辞というものなんだ。 さらら: へっ?..... (?_?) たけち: あっ、じゃあ、この例での名前空間接頭辞と名前空間の関係を整理しておこうね。それから、名前空間接頭辞を使った要素名についてもね。 |
■名前空間とスキーマの所在
さらら: え〜と、私、mpとかkaisetsuとかxhというのが「名前空間」で、「http://www.yuragi.jp/ns/manyouPoem」とか「http://www.yuragi.jp/ns/kaisetsu」とか「http://www.yuragi.jp/ns/kaiwa」とか「http://www.w3.org/1999/xhtml」というのが、それを定義したスキーマの置き場所だと思ったんだけれど... たけち: うん、それは大きな誤解だね(^ ^;) さらら: え〜っ!(^^;) でも、mpとかkaisetsuとかxhというのが「接頭辞」だとして、「http://www.yuragi.jp/ns/manyouPoem」とか「http://www.yuragi.jp/ns/kaisetsu」とか「http://www.yuragi.jp/ns/kaiwa」とか「http://www.w3.org/1999/xhtml」というのは、それを定義したスキーマの置き場所なんでしょ。 たけち: そうじゃないんだよ。名前空間とスキーマの置き場所はまったく違っていてかまわないし、一緒にしないといけないという決まりもないんだ。 |
さらら: え、そういうふうな決まりはないの?(^ ^;)...... たけち: そう、そんな決まりはどこにもないんだよ。まあ別にここにスキーマを定義したファイルを置いたからといって問題はないし、実際そういうことをしているXMLの応用規格も少なくないけれど、でも元々これにはスキーマの置き場所としての意味はないし、そうしないといけない必然性はどこにもないんだね。 さらら: でもこういうURIだったけ、元々インターネット上でファイルの置き場所をなどを示すためのものでしょ。 たけち: 元々はね。そしてそのために、ファイルの置き場所の名前が重なっては困るから、一つのURIが示す場所は、世界中で一つしかないように、一意性が保たれるように管理されているんだ。そしてXMLの名前空間というのは、その本来の置き場所的な役目を利用しているのではなくて、その前提となっている一つのURIが示す場所は、世界中で一つしかないということを利用しているものなんだよ。 |
■名前空間でスキーマの唯一性を確保
さらら: へぇ〜。 たけち: つまり、名前空間の一番の役目は「一つのURIが示すものは、世界中で一つしかない」という「一意性」なんだ。http://www.yuragi.jp/ns/kaisetsu という名前が示すものは、世界でこれだけしかない、というところが大事なんだね。逆に言うと、http://www.yuragi.jp/ns/kaisetsu という名前は、世界のどこに行っても、この名前で通用するし、これが指し示すものは一つしかないんだ。 さらら: そうなんだぁ〜。 たけち: .以前IDについて説明したときと同じ説明を繰り返すけれど... 例えば人の名前でいうと、「鈴木一郎」なんていう名前は、日本では何人もいそうな名前だよね。要素のローカル名も人名と同じで、同じ名前がいくつも存在しても不思議ではない。そこでこれらをコンピュータで安心して扱えるように「世界中で一つしかない」名前にするためにはどうしたらいいか、という問題が生じるんだ。ここで、家の場合は現住所、そして名前空間の場合はスキーマの置き場所で「世界中で一つしかない」ということを表現できそうな気がするけれど、ところがこれには「現住所やスキーマの置き場所はいつ変更されてもおかしくない」という問題があるんだ。 さらら: そうね、現住所なんて、いつ引っ越すかわからないものね。 |
たけち: そこで家、つまり人名の場合は、日本では本籍地を使って同姓同名を区別していたんだね。本籍地というのは、日本国内だったら、出身地や現住所などとまったく関係なく、どこにでも定めても良いとされている。何故こんな「出身地や現住所と関係なくてもかまわない地名」が必要かというと、結局、人名だけでは同姓同名の人を区別できないから、それに本籍地を付けることにより「○○県○○市○○町○○番地が本籍地の鈴木一郎」さんということで、一人に絞り込むことができるからなんだ。 さらら: そうね。 たけち: 同様に、名前空間というのはURIを利用して、スキーマを一つに絞りこむための仕組みなんだよ。そして本籍地と現住所が同じである必要性はまったくないように、スキーマの名前空間と、スキーマを定義したファイルが実際に置かれている置き場所が同じである必要性もまったくないんだ。名前空間というのは、要素や属性の集まりを、一種の家族だと考えると、その本籍地のようなものなんだね。 さらら: なるほどね。 |
■接頭辞の役割
たけち: たとえば、documentなんていう名前の要素を使ったスキーマを定義する人なんて、世界中でたくさんいるだろうね。でも、「http://www.yuragi.jp/ns/kaisetsuのdocument要素」というのは、世界中で自分たちが決めたものだけが使われることになるんだよね。 さらら: 世界で一つだけなんて、ちょっと素敵だわ(^^) たけち: ところが、「世界で一つしかない名前」が不便なのは、「すごく長い」ということなんだ。普段、 「http://www.yuragi.jp/ns/manyouPoemのpoemの子要素にhttp://www.yuragi.jp/ns/manyouPoemのpoet要素とhttp://www.yuragi.jp/ns/manyouPoemのkana要素とhttp://www.yuragi.jp/ns/manyouPoemのyomi要素がある」 なんて言い方をしていたら、わけがわからないよね(^^;) さらら: そうね(^^;) |
たけち: 同様に、人の名前を呼ぶときも、「○○県○○市○○町○丁目○番地が本籍地の鈴木一郎さん」なんて普通呼ばないよね。「鈴木一郎さん」と呼ぶことさえ少なくて、仕事場では「鈴木さん」とか、ちょっと親しい間柄だと「イチロー」とか「イチ」とかいった「あだ名」になるよね。例えば僕がさららのことをいつも「鵜野讃良皇女」とか呼んでいたら、すごく堅苦しいよね(^^;) さらら: やだぁ、そんな呼び方 (^ ^;) たけち: じゃあ、どうしたらいいかというと、最初に さらら: そうね。 たけち: さて、名前空間もちょっと似たようなことをするのだと考えてね。本来の名前空間は本籍地のように世界で一つしかない存在だけれど、やたらと長いのが弱点なんだ。そこで、さっきの例では「本籍地+姓名」について「あだ名」を適用したけれど、名前空間の場合は「本籍地」にあたる名前空間だけに「あだ名」を決めてしまうようなことをするんだよ。まず最初に、 |
これから使う mp という言葉は、http://www.yuragi.jp/ns/manyouPoem のことです |
と宣言してしまえばいいんだよ。要するに mp といった「接頭辞」というのは一種の「あだ名」なんだ。その「あだ名」が一意性のある名前空間と対応していることを最初に宣言してしまえばいいんだね。これが「名前空間宣言」であって、 さらら: あ、そういうことなんだぁ(^^) たけち: そしてまた、こうしておくと、例えば |
さらら: なるほど。 たけち: ここで気をつけてほしいのは、mpという接頭辞は、あくまで一時的に仮に定めた「あだ名」でしかないということなんだ。だから、「あだ名」をいくら変えても、その「あだ名」が常に同じ名前空間のものとして宣言されていれば、それは同じ意味になる。逆に「あだ名」が同じでも、それが違った名前空間として宣言されていれば、それは違う意味になるんだ。例えば、つぎのスキーマを見て。 |
<?xml version="1.0" encoding="Shift_JIS" ?> |
さらら: これってスキーマ? xslという接頭辞が使われているわ。でもXSLTではないわよね。 たけち: そう、これはXSLTなどではなくて、まったく間違いがないXML Schemaの書き方だよ(^^;) 悪趣味だし、こんな接頭辞を使うべきじゃないけどね(^^;) 逆にこんな例をみてみようね。 |
<?xml version="1.0" encoding="Shift_JIS" ?> |
たけち: これは接頭辞は今までどおりxsdを使っているから、一見正しいXML Schemaのように見えるけれど、実はXML Schemaじゃないんだ。よく見ると、このxsdという接頭辞が示している名前空間はXML Schemaの名前空間じゃないんだからね。 さらら: う〜ん、そうなのね。 たけち: 今まで説明する際にも「 |
■名前空間はXML Schemaで使う
さらら: なるほど、これでだいたい名前空間の考え方はわかったわ(^^) じゃあ、さっきの名前空間のついたXMLデータはDTDでどう定義するの? たけち: うん、DTDじゃ書けないんだよね(^ ^;) さらら: え、書けないの? ? たけち: そう、書けないんだ。もう少し詳しく言うと、何とか誤魔化して書けないこともないけれど、そのうちにっちもさっちもいかなくなる事態に陥ることがあるんだ。 さらら: それじゃあ、今までの話っていったい何!? たけち: DTDではできないけれど、XML Schemaは名前空間にちゃんと対応しているんだよ(^^) さらら: あっ。。。(^ ^; |
さらら: じゃあ、具体的にさっきのXMLデータはどんなXML Schemaで書くことができるの?? たけち: うーん、そこまで話すのはもっと先にしようと思ったんだけれど… 一度に説明すると頭が混乱すると思うから、まずは眺めるだけにしておこうね(^^;) |
※XMLスキーマ例: 万葉歌と解説-1【kaisetsu.xsd】 ※XMLスキーマ例: 万葉歌と解説-2【manyouPoem.xsd】 ※XMLスキーマ例: 万葉歌と解説-3【kaiwa.xsd】 |
■import
さらら: きゃ〜、やっぱりよくわからない(^^;) たけち: そうだね、詳しいことは後から説明するとして、ここで大事なのは、3つ目のスキーマのつぎの部分だよ。 |
<xsd:import namespace="http://www.yuragi.jp/ns/manyouPoem" |
さらら: import? たけち: importというのは、「輸入する、導入する、持ち込む」といった意味だね。それぞれ、manyouPoem.xsd、http://www.w3.org/2002/08/xhtml/xhtml1-transitional.xsdというファイルで定義されているスキーマを取り込みますって、意味なんだよ。 |
さらら: あ、なるほど。こうすることによってXHTML系の要素を参照することができるのね。でも、これってインターネット上に置かれているXML Schemaを参照しているけれど、そんなものを使って検証できるの? たけち: それは、XSVのようなインターネット対応のValidatorを使えば検証できるよ(^^) さらら: あ、そうなの(^^) たけち: ちなみにhttp://www.w3.org/2002/08/xhtml/xhtml1-transitional.xsdというのは、現時点で最新のXHTMLのXML Schema案が置かれている場所なんだよ。いわばこれがXHTMLのXML Schemaの現住所なんだ。だから今後、これが変更されることは十分あるんだけどね。最終的にはhttp://www.w3.org/1999/xhtml.xsdに置かれそうなんだけれど、今はそこにはないんだ。 さらら: ふ〜ん、そうなのね。 たけち: これらによって、kaisetsu.xsdやkaiwa.xsdは、manyouPoem.xsdが定めた要素や、XHTML系の要素を使うことができているんだね。これらのことをまとめておこうね。 |
1. 名前空間を使ってスキーマを定義すると、それらを再利用することによって、無駄を省いた効率の良いスキーマ構築が可能になる。 2. 名前空間のURIは「現住所」ではなくて「本籍地」のようなものである。名前空間のURIが、スキーマを定義したファイルの置き場所となっている必然性はどこにもない。すなわち名前空間のURI(本籍地)と、スキーマを定義したファイルのURI(現住所)は全く別物であってかまわない。 3. 名前空間の接頭辞はあくまで名前空間の「あだ名」である。「あだ名」なのだから慣用的なものを使うべきだが、本当にそれがきちんと目的の名前空間と対応づけられているかどうかは、名前空間宣言で確認しておかないといけない。 4. DTDは本質的に名前空間に対応できていないため、名前空間を生かしたスキーマを定義しようとするとXML Schemaを使うべきである。 |
さらら: うん、だいたいのことはわかったわ。でも、まだXMLスキーマの中身がよくわかんないけど。 たけち: それについては次回から、少しずつ説明していくことにしようね(^^) ひとまず今回はこれでおしまい。 さらら: あっ、は〜い!! 次回は対象名前空間です。...... (^ ^)v |
■(注1) XHTML 1.0は大きく3種類の規格に分かれており、そしてそれぞれごとにDTDやXML Schemaが定められています。 【XHTML 1.0 Strict】 【XHTML 1.0 Transitional】 【XHTML 1.0 Frameset】 上記の説明では「XHTML 1.0 Transitional」を便宜的に用いました。 |
■XMLスキーマのコーナーは、TAKABEさま(XSLTの遊び部屋)の全面的なご協力をいただいて作成しています。 |