2003年3月30日(日)更新 |
■XMLの名前空間
さらら: で、どうなの? たけち: その前に、XMLの名前空間について整理しておこうね。 さらら: ・・・(^ ^; たけち: XMLの名前空間は次のように3つの区画に分かれているんだ。 |
|
さらら: う〜ん。文字だけ見ても具体的なイメージがわかないわ。 たけち: じゃあねぇ〜。例えば以下のようなXMLデータを考えてみようね。 |
※XMLデータ例: 万葉歌 |
さらら: たくさん属性があるわね。 たけち: このXMLデータの名前空間の区画がどうなっているかを図で見てみようね。 |
たけち: 一つの区画の中には、同じ名前が2つ以上あってはいけない。1つの名前は必ず1つの物を指し示すんだ。しかし、区画が違えば同じ名前があってもいいんだよ。 さらら: mp:kana要素とmp:yomi要素に、classという同じ名前の属性があるけど、これは要素ごとの区画にあるから、同じ名前でもかまわないのね。 たけち: それで、グローバル属性区画というのが、これらとは別に存在する名前空間の区画で、ここには名前空間接頭辞が付いた属性が入るんだね。 さらら: ふ〜ん、こういうふうに分けて考えるのね。 たけち: これをちゃんと意識すると、同じ名前の要素と属性が存在してもいいことがわかるよね。例えば次のようなデータもあっていいんだね。 |
※XMLデータ例: 同じ名前の要素と属性が存在しても良い |
たけち: samenameという名前が、要素、接頭辞の付いた属性、付かない属性の3箇所で使われているけれど、それらは、全ての要素型の区画 さらら: なるほどね。。。。。あっ、で、問題のデータは? たけち: うん、あれは正しいんだよ。もう一度見てみようね。 |
※XMLデータ例: 正しい!! |
たけち: デフォルト名前空間を使っているね。でも、デフォルト名前空間を使っていてもいなくても、名前空間接頭辞の付いた属性はグローバル属性区画の属性、つまりグローバル属性であって、付かない属性は要素型ごとの区画の属性なんだ。だから、これはエラーにならないんだよ。 さらら: へぇ〜、そうなの。 たけち: 以前も説明したけれど、最初にXMLの規格が公表されたのは1998年2月10日のことなんだけれど、その後の1999年1月14日に「Namespace in XML」という名前空間の規格が発表されたんだ。この「Namespace in XML」という規格に、今説明したことが書かれているんだ。そして、その中には次のように書いてあるんだよ。 |
In XML documents conforming to this specification, the names of all qualified (prefixed) attributes are assigned to the global attribute partition, and the names of all unqualified attributes are assigned to the appropriate per-element-type partition. |
The only required characteristic of a global attribute is that its name be unique in the global attribute partition. This specification makes no assertions as to the proper usage of such attributes. |
XML 1.0 does not provide a built-in way to declare "global" attributes; items such as the HTML CLASS attribute are global only in their prose description and their interpretation by HTML applications. However, such attributes, an important distinguishing feature of which is that their names are unique, are commonly observed to occur in a variety of applications. |
さらら: わかんない・・・(^ ^; たけち: 平たく言うと、 さらら: えっ、それってどういうこと?? |
■規格の分立 XMLはXML Schemaではない
さらら: で、どうなの? たけち: 混乱するかもしれないから、今までの話を箇条書きにしてまとめてみようね。Namespace in XMLはXMLの名前空間について定めた規格なんだけれど、その中で書かれていることは、次のようなことだったね。 |
|
さらら: う〜ん。。。4や5は納得できないわ。だって、前に、print:color属性の宣言の仕方を、たけちは説明してくれたじゃない。所属する要素に関係なく、一定の目的を持って一定のデータ型をとる属性で、異なる名前空間のスキーマで使われることもあるという属性っていってた、あのグローバル属性宣言って何だったの? たけち: うん、前回学んだのはXML Schemaのグローバル属性宣言だったよね。でも、あくまで「XML Schemaのグローバル属性宣言」であってXMLのグローバル属性宣言じゃないんだよ。 さらら: はぁ(?_?) たけち: 「XML Schemaの規格と、XMLの規格は、別物」、「XML Schemaの規格はXMLの応用規格」ということなんだ。つまり規格が分立しているんだよ。 さらら: 規格が分立? たけち: Extensible Markup Language (XML) 1.0は何かというと、「表記の仕方を決める規格」なんだよね。もうちょっと現実的に考えると、「Namespace in XML」がこれを修正拡張したものだと考えられるよね。このふたつが「純粋なXMLの規格」っていえるものだね。 さらら: あ、そうなんだ。 |
たけち: さて、話を「グローバル属性」に戻すよ。名前空間接頭辞のついた属性、つまりグローバル属性は「所属する要素に関係なく、一定の目的を持って一定のデータ型をとる属性であり、場合によっては異なる名前空間のスキーマで使われることもある」という属性であった方が自然で素直だし、「要素型ごとの区画の属性」は「要素ごとの性質に密接に関与している」属性である方が自然で素直だよね。 さらら: そうよね。 たけち: ところが最初に説明したように、純粋なXMLの規格、つまり「表記の仕方を決める規格」とスキーマ言語は分離されたし、分離することによって複数のスキーマ言語を選択する道が開けた。ということは、純粋なXMLの規格としては「表記の仕方」だけを決めるべきであって、それ以上のことに踏み込むべきではないんだ。だからさっき見たような記述がされているんだろうね。 さらら: あ、そうなのね! たけち: ということは、最初に話をしたような意図からはなれて、従来DTDがパラメータエンティティを使ってやったように「グローバルな使われ方をするけれども、名前空間接頭辞がつかない、要素型ごとの区画の属性」のような存在も、XMLの規格の中では許されるし、また逆に「要素ごとに異なるローカルな使われ方をするけれども、名前空間接頭辞が付いたグローバル属性」のような存在も許されるわけなんだ。実際、XMLの応用規格の中には「要素ごとに異なるローカルな使われ方をするけれども、名前空間接頭辞が付いたグローバル属性」が出てきたりするんだよ。そしてそうなってくると、スキーマ言語としては完璧を期するなら、そういう本来の意図から離れた存在すらも記述できるようにすべきだし、実際、XML SchemaでもRELAX NGでも、そういうものを記述できる仕組みが用意されているんだよ。 さらら: えっ? たけち: つまり、XML Schemaでは、グローバルな宣言の仕方をしてもグローバル属性にならないような書き方もできるようになっているし、また逆に、データ型の中でローカルに属性を宣言してもグローバル属性にする方法が用意されているんだよ。 |
さらら: なっ、なにそれ(^ ^;) たけち: XMLの属性には要素型ごとの区画の属性とグローバル属性の2種類があって、XML Schemaにはローカル属性宣言とグローバル属性宣言の2種類があるんだ。単純に考えると、 さらら: うぅぅん... たけち: ますます、混乱しちゃったかな(^ ^;) ここで一旦休憩して、それから実際のXML Schemaの書き方を見てみることにするね。それでわかってもらえるとおもうけど。。。 さらら: そっ、そうね。・・(^ ^; グローバル属性とグローバル属性宣言 その5に続きます...... (^ ^; |
■XMLスキーマのコーナーは、TAKABEさま(XSLTの遊び部屋)の全面的なご協力をいただいて作成しています。 |