2003年3月2日(日)更新 |
■万葉歌人データの例を考えてみます
たけち: 今回からちょっと違った話をするね。突然なんだけれど、次のXMLデータとDTDを見て。 |
※XMLデータ例: 万葉歌人 |
※DTD: 万葉歌人 |
たけち: 意味はだいたいわかるよね。ある人物について、その名前と性別、そして位(くらい)についてのデータを示したものなんだよ。 さらら: まあ、だいたいわかる気がするわ。 たけち: じゃあ、これのXML Schemaはもう書けるよね。 さらら: えっ?! え〜と (^ ^;) |
![]() |
※W3C XML Schema: 万葉歌人 |
■同じ名前で、異なるデータ型の属性
たけち: さて、今回の例題で、classという名前の属性について考えてみよう。 <pi:sex class="male" /> さらら: そうよね。pi:sex要素のclass属性はmaleかfemaleかの列挙型だし、pi:degree要素のclass属性は正一位から少初位下までの列挙型だわ。これは異なるデータ型よね。 たけち: 同じclassという名前の属性なんだけど、異なるデータ型をとっているね。これって不思議な感じがしない? さらら: う〜ん。別に不思議でもなんでもないんじゃない。 たけち: 要素の場合、同じ名前の要素で違ったデータ型をとったことはなかったよね。 さらら: あ、それはなかったわ。ある名前の一つの要素は、必ず何らかの一つのデータ型と結びついていたわね。 |
![]() |
たけち: でも、要素の場合、同じ名前の要素で違ったデータ型をとったことはなかったよね。 さらら: あ、それはなかったわ。ある名前の一つの要素は、必ず何らかの一つのデータ型と結びついていたわね。
<!ELEMENT pi:sex EMPTY> たけち: そうだね。だけどどうして、同じ名前の要素は必ず何らかの一つのデータ型と結びついているのに、同じ名前の属性は異なるデータ型をとることがあるんだろうか? さらら: どうしてって言われても... 要素と属性はそういうふうに決められているからでしょ。 たけち: う〜ん、そうだねぇ。じゃあまずDTDの書き方から見てみようかな。 |
![]() |
<!ELEMENT pi:sex EMPTY> |
たけち: pi:sexとかpi:degreeといった要素は、他の要素などは関係なく、それがどういうデータ形式をとるかが宣言されているよね。 さらら: えぇ。 たけち: そう。もしここで、 さらら: そうよね。 |
■どの要素の属性か、どのデータ型の属性か
たけち: それに対して属性リスト宣言の方は、 |
<!ATTLIST pi:sex
class (male | female) #REQUIRED
> |
たけち: というふうに、「pi:sex要素のclass属性」「pi:degree要素のclass属性」という書き方がされているんだ。つまりDTDでは、属性は、どの要素の属性かということを書かないと宣言できないんだ。 さらら: えぇ、そういう書き方するわよね。 たけち: じゃあ、次にXML Schemaではどう書いていたかをみてみようね。 |
<xsd:complexType name="SexType"> |
たけち: この書き方を見てわかるように、直接、要素宣言の直下で属性宣言をするのではなくて、SexType型のclass属性、DegreeType型のclass属性ということを書いて宣言していたんだね。 さらら: そういうことになるわ。それで? たけち: 属性は「どの要素の属性か」「どのデータ型の属性か」という書き方で宣言していた。だから、同じclassという名前の属性でも、「どの要素の属性か」「どのデータ型の属性か」ということが違えば、異なるデータ型になってもかまわなかった、ということなんだ。 さらら: えぇ、でも何か、すごくあたりまえのことのように思えるわ。 たけち: うん、そうなんだけれど、ここでわかって欲しかったのは、属性というものは、要素やデータ型に所属しているものだという考え方がある、ということなんだ。 |
![]() |
さらら: それってあたりまえじゃないの? 「要素に所属している性質」なんだから「属性」と呼ぶわけなんでしょ。 たけち: うん、そうだね。今さららが言ったことは、属性に対する考え方の基本なんだね。 さらら: 基本? じゃあ、応用があるの?...えっ? さらら、混乱のうちに、グローバル属性とグローバル属性宣言 その2に続きます...... (^ ^; |
![]() |
■XMLスキーマのコーナーは、TAKABEさま(XSLTの遊び部屋)の全面的なご協力をいただいて作成しています。 |