グローバル属性とグローバル属性宣言 その4

2003年3月30日(日)更新


■XMLの名前空間

さらら: で、どうなの?

たけち: その前に、XMLの名前空間について整理しておこうね。

さらら: ・・・(^ ^;

たけち: XMLの名前空間は次のように3つの区画に分かれているんだ。

  1. All Element Types Partition(全ての要素型の区画) 要素の名前空間
  2. Global Attribute Partition(グローバル属性区画) 名前空間接頭辞が付いた属性の名前空間
  3. Per-Element-Type Partitions(要素型ごとの区画) 名前空間接頭辞が付かない属性の名前空間

さらら: う〜ん。文字だけ見ても具体的なイメージがわかないわ。

たけち: じゃあねぇ〜。例えば以下のようなXMLデータを考えてみようね。

さらら

XMLデータ例: 万葉歌
<?xml version="1.0" encoding="Shift_JIS" ?>
<mp:poem pno="4088" xmlns:mp="http://www.yuragi.jp/ns/manyouPoem">
<mp:poet degree="従三位" sex="male" mp:color="black" mp:size="12pt">大伴家持</mp:poet>
<mp:kana class="万葉仮名" mp:color="red" mp:size="14pt">左由理婆奈 由里毛安波牟等 於毛倍許曽 伊末能麻左可母 宇流波之美須礼</mp:kana>
<mp:yomi class="花の歌" mp:color="blue" mp:size="14pt">さ百合花、ゆりも逢はむと、思へこそ、今のまさかも、うるはしみすれ</mp:yomi>
</mp:poem>

さらら: たくさん属性があるわね。

たけち: このXMLデータの名前空間の区画がどうなっているかを図で見てみようね。

名前空間 http://www.yuragi.jp/ns/manyouPoem の区画

たけち: 一つの区画の中には、同じ名前が2つ以上あってはいけない。1つの名前は必ず1つの物を指し示すんだ。しかし、区画が違えば同じ名前があってもいいんだよ。

さらら: mp:kana要素とmp:yomi要素に、classという同じ名前の属性があるけど、これは要素ごとの区画にあるから、同じ名前でもかまわないのね。

たけち: それで、グローバル属性区画というのが、これらとは別に存在する名前空間の区画で、ここには名前空間接頭辞が付いた属性が入るんだね。

さらら: ふ〜ん、こういうふうに分けて考えるのね。

たけち: これをちゃんと意識すると、同じ名前の要素と属性が存在してもいいことがわかるよね。例えば次のようなデータもあっていいんだね。

たけち

XMLデータ例: 同じ名前の要素と属性が存在しても良い
<?xml version="1.0" encoding="Shift_JIS" ?>
<ex:samename ex:samename="これは良い" samename="良いんだよ"
         xmlns:ex="http://www.example.com/">
良いよね<ex:samename>

たけち: samenameという名前が、要素、接頭辞の付いた属性、付かない属性の3箇所で使われているけれど、それらは、全ての要素型の区画グローバル属性区画要素型ごとの区画の3つの区画それぞれに分かれているよね。

さらら: なるほどね。。。。。あっ、で、問題のデータは?

たけち: うん、あれは正しいんだよ。もう一度見てみようね。

XMLデータ例: 正しい!!
<?xml version="1.0" encoding="Shift_JIS" ?>
<ex:example ex:samename="これは良いのかな"
                samename="良いかな"
                xmlns:ex="http://www.example.com/"
                xmlns="http://www.example.com/">
  本当に良いの?<ex:example>

たけち: デフォルト名前空間を使っているね。でも、デフォルト名前空間を使っていてもいなくても、名前空間接頭辞の付いた属性はグローバル属性区画の属性、つまりグローバル属性であって、付かない属性は要素型ごとの区画の属性なんだ。だから、これはエラーにならないんだよ。

さらら: へぇ〜、そうなの。

たけち: 以前も説明したけれど、最初に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.

さらら: わかんない・・・(^ ^;

たけち: 平たく言うと、
「名前空間接頭辞が付いている属性はすべてグローバル属性区画の属性(グローバル属性)であり、付いていない属性はすべて要素型ごとの区画の属性である。この規格書では、これらの属性の適切な使い方がどうなのか、といったことは何も示さない。またHTMLのclass属性のような「グローバル」に使われる属性を宣言する方法を、(狭義の意味の)XML 1.0の規格自身では提供しない」  ということになるんだ。

さらら: えっ、それってどういうこと??


■規格の分立 XMLはXML Schemaではない

さらら: で、どうなの?

たけち: 混乱するかもしれないから、今までの話を箇条書きにしてまとめてみようね。Namespace in XMLはXMLの名前空間について定めた規格なんだけれど、その中で書かれていることは、次のようなことだったね。

  1. XMLの名前空間は、「全ての要素型の区画」「グローバル属性区画」「要素型ごとの区画」の3つの区画に分かれる。
  2. 名前空間接頭辞が付いている属性はすべてグローバル属性である。
  3. 名前空間接頭辞が付いていない属性はすべて要素型ごとの区画の属性である。
  4. これらの属性の適切な使い方はどうあるべきか、といったことは何も示されていない。
  5. 「グローバル」に使われる属性を宣言する方法は提供されていない。

さらら: う〜ん。。。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関連の規格というのは、W3Cが定めたものだけでも、XSLT、XSL-FO、XLinkなどいろいろなものがあるし、その一方でW3C以外の組織が定めたXML関連の規格も数多くあり、特にRELAX NGなどは、W3C以外の組織が提唱したスキーマ言語として注目されているよね。これらはXMLの周辺の規格なんだね。

さらら: あ、そうなんだ。

たけち

たけち: さて、話を「グローバル属性」に戻すよ。名前空間接頭辞のついた属性、つまりグローバル属性は「所属する要素に関係なく、一定の目的を持って一定のデータ型をとる属性であり、場合によっては異なる名前空間のスキーマで使われることもある」という属性であった方が自然で素直だし、「要素型ごとの区画の属性」は「要素ごとの性質に密接に関与している」属性である方が自然で素直だよね。

さらら: そうよね。

たけち: ところが最初に説明したように、純粋なXMLの規格、つまり「表記の仕方を決める規格」とスキーマ言語は分離されたし、分離することによって複数のスキーマ言語を選択する道が開けた。ということは、純粋なXMLの規格としては「表記の仕方」だけを決めるべきであって、それ以上のことに踏み込むべきではないんだ。だからさっき見たような記述がされているんだろうね。

さらら: あ、そうなのね!

たけち: ということは、最初に話をしたような意図からはなれて、従来DTDがパラメータエンティティを使ってやったように「グローバルな使われ方をするけれども、名前空間接頭辞がつかない、要素型ごとの区画の属性」のような存在も、XMLの規格の中では許されるし、また逆に「要素ごとに異なるローカルな使われ方をするけれども、名前空間接頭辞が付いたグローバル属性」のような存在も許されるわけなんだ。実際、XMLの応用規格の中には「要素ごとに異なるローカルな使われ方をするけれども、名前空間接頭辞が付いたグローバル属性」が出てきたりするんだよ。そしてそうなってくると、スキーマ言語としては完璧を期するなら、そういう本来の意図から離れた存在すらも記述できるようにすべきだし、実際、XML SchemaでもRELAX NGでも、そういうものを記述できる仕組みが用意されているんだよ。

さらら: えっ?

たけち: つまり、XML Schemaでは、グローバルな宣言の仕方をしてもグローバル属性にならないような書き方もできるようになっているし、また逆に、データ型の中でローカルに属性を宣言してもグローバル属性にする方法が用意されているんだよ。

たけち

さらら: なっ、なにそれ(^ ^;)

たけち: XMLの属性には要素型ごとの区画の属性グローバル属性の2種類があって、XML Schemaにはローカル属性宣言グローバル属性宣言の2種類があるんだ。単純に考えると、
    要素型ごとの区画の属性 = ローカル属性宣言
    グローバル属性 = グローバル属性宣言
 と考えたいし、そう考えるとすっきりするし、ある程度そういう方向性は実際にあるけれど、必ずしもそうじゃないところもあるんだね(^ ^;)

さらら: うぅぅん...

たけち: ますます、混乱しちゃったかな(^ ^;) ここで一旦休憩して、それから実際のXML Schemaの書き方を見てみることにするね。それでわかってもらえるとおもうけど。。。

さらら: そっ、そうね。・・(^ ^;

グローバル属性とグローバル属性宣言 その5に続きます...... (^ ^;

さらら

XMLスキーマのコーナーは、TAKABEさま(XSLTの遊び部屋)の全面的なご協力をいただいて作成しています。