属性の宣言

2002年9月1日(日)更新


■DTDとXMLスキーマの属性宣言

たけち: 今回は属性の宣言の仕方についてきちんと勉強しておこうね。

さらら: えぇ。要素宣言と属性宣言の両方を知っておかないといけないものね。

たけち: まずDTDの属性リスト宣言について見直してみようね。DTDでは次のように属性リスト宣言をしていたよね。

<!ATTLIST 要素名 属性名 データ型 デフォルト値>

たけち

たけち: このDTDの属性リスト宣言とXMLスキーマの属性宣言を比較してみてまず違うことは、

 ・DTDでは要素に対して属性を宣言するのに対し、
  XMLスキーマではデータ型の定義の中で属性を宣言する

ということなんだよ。DTDではこの要素には、この属性ということを直接決めていたのに対し、XMLスキーマではこのデータ型には、この属性ということを決めた上で、「この要素には、このデータ型」ということを宣言する、という間接的な決め方をしているんだよ。

さらら: そうね。「XMLスキーマでは、はじめにデータ型ありき」という話だったのよね。

DTDとXMLスキーマの属性宣言


■属性のデータ型

たけち: さて、「属性のデータ型」なんだけれど、DTDでは基本的に、次の4つのデータ型があったんだよね。

  • CDATA (文字列)
  • NMTOKEN (基本的に「名前」の規則に従うが、「名前」の2文字目以降に使うことのできる文字(例えば数字)を先頭に書いてよいもの)
  • NMTOKENS (複数のNMTOKENを半角スペースで区切って並べたもの)
  • 列挙型 (値の候補を列挙したもの。例えば (雑歌 | 挽歌 | 相聞歌) といった形)

さらに特殊な機能、用途を属性に持たせるデータ型としては、つぎのようなものもあるけれど、基本は最初の4種類だよね。

  • ID
  • IDREF/IDREFS
  • ENTITY/ENTITIES

これに対して、XMLスキーマでは、これらも含めて、これより遥かに種類に富んだ単純型のビルトインデータ型が使える上に、さらに自分で定義した単純型のユーザ派生データ型が使えたよね。


■属性のデフォルト値

さらら: あの話だけで疲れちゃった.....(^ ^;

たけち: あっ...(^ ^; いや...さて、ここまでは今までしてきた話のまとめなんだけれど、デフォルト値の話をまだしていなかったよね。さららは属性リスト宣言のデフォルト値の部分にどんなキーワードを入れることができたのか覚えている?

さらら: えっ、え〜と..... (^ ^;

たけち: 属性リスト宣言のデフォルト値の部分は次の4種類のパターンに分かれるんだよ。

さらら

<!ATTLIST 要素名 属性名 属性のデータ型 #REQUIRED>
属性は必ず存在しなければいけない
<!ATTLIST 要素名 属性名 属性のデータ型 #IMPLIED>
属性は存在してもしなくても良い
<!ATTLIST 要素名 属性名 属性のデータ型 "デフォルト値">
属性が省略された場合、デフォルトとなる値(default_value)を指定している
<!ATTLIST 要素名 属性名 属性のデータ型 #FIXED "固定値">
属性が取るべき値を、ある値(fixed_value)に固定している

さらら: そっ、そうだったわね.....(^ ^;

たけち: この中の#REQUIREDについては前回例を出したよね。

さらら: あっ、そうだったわね。

<?xml version="1.0" encoding="Shift_JIS" ?>
<xsd:schema xmlns:xsd="http://www.w3.org/2001/XMLSchema">

<xsd:element name="yomi" type="YomiType" />

<xsd:complexType name="YomiType">
<xsd:simpleContent>
<xsd:extension base="xsd:string">
<xsd:attribute name="pno" type="xsd:positiveInteger" use="required" />
</xsd:extension>
</xsd:simpleContent>
</xsd:complexType>

</xsd:schema>

さらら: この中の
<xsd:attribute name="pno" type="xsd:positiveInteger" use="required" />
で、use属性の値がrequiredになっているところね。

たけち: そうだね。この要素のuse属性は次の3つのどれかの値をとるんだ。

さらら

required: 属性は必ず存在しなければいけない
optional: 属性は存在しても存在しなくてもよい
             (use属性が省略されると、このoptionalとなる)
prohibited: 属性の存在を禁止する

さらら: use="optional"というのがDTDの#IMPLIEDに相当するのね。

たけち: そう、ちなみにuse属性そのものが省略されると、デフォルトでこのuse="optional"が選ばれたことになるんだ。

さらら: それは良いんだけど、このuse="prohibited"って何なの?? 属性の存在を禁止するくらいなら、最初から属性の宣言を書かなければいいんじゃないの??

たけち: やっぱり、さららもそう思ったんだね (^ ^; これだけ見ると確かに変に見えるけれども、これはこれで使い道があるんだよ。これの使い方については、また別のところで説明するね (^ ^;

さらら: う〜ん。。。それじゃあ、またそのときに教えてね。あと、属性のデフォルト値を指定する場合や、属性の値が固定されている場合はどうなるの?

たけち: まず属性のデフォルト値を指定する場合は次のように書くんだよ。

さらら

<xsd:attribute name="属性名" type="データ型名" default="デフォルト値" />

<xsd:attribute name="属性名" type="データ型名" default="デフォルト値" use="optional" />

たけち: よく考えればわかるけれど、「デフォルト値が存在するとき」というのは必ず「属性があったりなかったりする場合」だよね。だから、必ずuse="optional"でなければならない。ただし、use属性そのものが省略されると、use="optional"の意味になるから、書かなくても別にかまわないよ。use属性を書く場合には必ずuse="optional"としないといけないけれどね。

さらら: 固定値の場合はどうなの?

たけち: 固定値の場合は、次のようになるんだ。

<xsd:attribute name="属性名" type="データ型名" fixed="固定値" />

たけち: ここで注意しないといけないのは、ある属性についてデフォルト値がある場合には固定値が存在することはありえないし、また固定値がある場合にはデフォルト値が存在することはありえない、ということだよね。だから default属性とfixed属性は両立しないんだ。どちらかが存在すれば、どちらかは絶対出現してはいけないんだよ。

さらら: なるほど、わかったわ。

たけち: 以上のことをDTDと比較して覚えておこうね。

たけち

DTDの属性リスト宣言とW3C XML Schemaの属性宣言の比較

たけち: 次回は、属性における匿名のデータ型について詳しく勉強しようね。

さらら: は〜い。

→ 次回は属性における匿名のデータ型です。。。。 (^ ^)v


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