属性の宣言の基本

2002年9月1日(日)更新


■属性の宣言

たけち:前回は「要素を宣言するためには、まずデータ型が必要」「要素の性質はデータ型が決めている」ということを話したんだよね。で、今回は、・・・

さらら: ねぇ、それでふと思ったんだけれど、属性の方はどう定義・・・じゃなかった、宣言すればいいのかしら?

たけち: え゛っ。。。それはもうちょっと後からしようと思ったんだけれど・・・さららがもうそういう疑問を持ってくれたんだったら、これも先走ってちょっと見てみようか。

さらら: えぇ。

たけち: じゃあ、つぎのようなpno属性がついたyomi要素をみてみよう。

たけち


  <yomi pno="8">熟田津に船乗りせむと月待てば潮もかなひぬ今は漕ぎ出でな</yomi>

たけち: これをDTDで書くとつぎのようになるね。

<!ELEMENT yomi (#PCDATA)>
<!ATTLIST yomi pno CDATA #REQUIRED>

さらら: えぇ、簡単なDTDだからわかるわ。

たけち: これをXMLスキーマで宣言すると、次のようになるんだ。今の時点で全部理解する必要はないから眺めるだけでいいよ。

さらら: えっ、えぇ。。

属性の例


■name属性とtype属性

さらら: <xsd:simpleContent>とか<xsd:extension base="xsd:string">とかいった言葉がいっぱいで、よくわからないわ。

たけち: うん、そこはそのうちゆっくり説明するから今はわからなくてもいいよ。この中で見てもらいたいのは次の二つなんだ。それぞれは、さっき見たDTDの<!ELEMENT yomi (#PCDATA)>と<!ATTLIST yomi pno CDATA #REQUIRED>に相当するんだ。

さらら

要素と属性の宣言

さらら: よく見ると、
  <xsd:element name="yomi" type="YomiType" />

  <xsd:attribute name="pno" type="xsd:positiveInteger" use="required" />
って、すごく似た形をしているわ。どちらもname属性のところで要素名や属性名を決めていて、そしてtype属性のところにデータ型があるのね。このxsd:positiveIntegerってデータ型の一つなのよね。でも、どういう意味かしら。

たけち: これは、Positive Integer、つまり「正の整数」を意味しているデータ型のことだよ。

さらら: あっ、そうなんだ。。。。あと、use="required"というのは、きっとDTDの#REQUIREDと同じ意味なのよね。

たけち: あたり〜。前回、

  • 要素を宣言するためには、まずデータ型が必要
  • 要素の性質はデータ型が決めている
という話をしたけど、属性についても同じことが言えるんだ。

  • 属性を宣言するためには、まずデータ型が必要
  • 属性の性質はデータ型が決めている

さらら


■スキーマにはデータ型が必要

さらら: そっか〜。それでよく考えたら、スキーマを定義するということは、XMLドキュメントの要素と属性を宣言するってことでしょ。ということは…

たけち: そうなんだね。このことをまとめると、

    ■スキーマを定義するためには、まずデータ型が必要
    ■スキーマの性質はデータ型が決めている

と言っていいかもしれないね。要するにXMLスキーマでは「はじめにデータ型ありき」ってことだね。

さらら: そういうことなのね。スキーマにはデータ型ね。


■DTDとXMLスキーマを比較すると

たけち: ところでここで「データ型」という観点から、DTDとXMLスキーマを比較してみようね。まずDTDの要素形宣言には、「データ型」という考え方はないよね。

さらら: えぇ。例えば、
<!ELEMENT a (#PCDATA)> とか、
<!ELEMENT a (b, c)>
みたいに、直接、内容となる要素やテキストを指定した形を宣言していたわ。

たけち: そうなんだ。ところがDTDの属性リスト宣言の方には、XMLスキーマとは格段の差があるけれども、実は属性に関しては、データ型の考え方があったと思ってもいいんだ。

さらら: え、そうなの?

たけち: ほら、以前、DTDの属性を勉強したときに、
<!ATTLIST 要素名 属性名 属性のデータ型 デフォルト値>
ということを勉強したよね。あまり細かいことは説明しなかったけど。

さらら: あっ、そっ、そうだったかしら。。。

たけち: DTDの場合、属性値に使えるデータ型の主なものをあげると、つぎのようなものだけれどね。ほかには、ID、IDREF/IDREFS、ENTITY/ENTITIESなんてのもあるけれどね。

さらら

CDATA
文字列
NMTOKEN
先頭に数字や記号を書いてよいNAME
NMTOKENS
複数のNMTOKENを半角スペースで区切って並べたもの
列挙型
値の候補を列挙したもの。例えば (雑歌 | 挽歌 | 相聞歌) といった 形

たけち: これから勉強するXMLスキーマのデータ型と比べると簡単なものといっていいものだけれど、それでもDTDの属性リスト宣言には、データ型の考え方があったんだね、きっと。

さらら: そうなのね。

たけち: これに対してXMLスキーマでは、属性の宣言だけでなく、要素の宣言に対しても、データ型の考え方を取り入れたということが言えるね。そして、そのデータ型の考え方も、DTDの属性値のデータ型とは比較にならないくらいパワーアップされてるんだ。

たけち

さらら: そういうことなのね。

たけち: 今回は要素と属性の宣言の似ている面について説明したけれども、次回は要素と属性を宣言するデータ型の相違点を説明するね。

さらら: は〜い。ありがと。

→ 次回はデータ型: 単純型と複合型です。。。。 (^ ^)v


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