Section 15 : DTD を読む(3)

 DTD において,要素と並行してなされるのがその属性の定義である。属性の定義では,値の種類や省略の可否が問題になる。

属性の定義

 属性の定義は,

<!ATTLIST ... >

で行われる。ATTLIST に続けて,属性を定義する要素の名前が入り,それから属性のリストが書かれる。

<!ATTLIST IMG
  %attrs;                              -- %coreattrs, %i18n, %events --
  src         %URI;          #REQUIRED -- URI of image to embed --
  alt         %Text;         #REQUIRED -- short description --
  longdesc    %URI;          #IMPLIED  -- link to long description
                                          (complements alt) --
  name        CDATA          #IMPLIED  -- name of image for scripting --
  height      %Length;       #IMPLIED  -- override height --
  width       %Length;       #IMPLIED  -- override width --
  usemap      %URI;          #IMPLIED  -- use client-side image map --
  ismap       (ismap)        #IMPLIED  -- use server-side image map --
  >

 HTML 4 では,ほとんどの要素にある属性は一括で定義されていて,パラメータ実体参照されている。“%coreattrs;”は ID や STYLE などの基本的なもの,“%i18n;”は国際化(言語)に関するもの(“i18n”は internationalization の略;i と n の間に 18 字),“%events;”は基本的なイベント属性である。これら 3 つは“%attrs;”でまとめて参照される。上の <IMG> の属性の定義では,%attrs; が展開される。

 それで,属性リストの書かれ方であるが,まずは属性名であることは説明するまでもないだろう。続いては与えられる値やその種類である。キーワードを与えるもの(列挙型:実はこれが正しい用語である)は (A | B | C | ...) のかたちで候補が示される。値の種類はパラメータ実体参照で表されていることが多いが,結局同じ値に置き換わることもある。同じデータ型だと言われていても,仕様書によってその詳細が定められることがほとんどである。

CDATA
要素のデータタイプと同じように文字のデータであるが,これは文字参照を含んでもよい。また,改行は本質的な意味を持たない。値の前あるいは後ろの空白文字は無視されることがあるが,UA によってはうまく動作しないおそれもあるので,前後に余計な空白は入れないようにしたい。
ID
英字で始まり,英字,数字,ハイフン,ピリオド,アンダースコア,コロンを含む文字列。
NAME
与え方は ID に同じ。
IDREFIDREFS
ほかの要素の ID 属性の値を参照する。IDREF では 1 つ,IDREFS では複数指定しうる。複数指定する場合はそれぞれを空白で区切る。
NUMBER
数値を与える。

 次に書かれるのは属性の省略についてである。既定値が明示的に指定されることもある。

<!ATTLIST COL                          -- column groups and properties --
  %attrs;                              -- %coreattrs, %i18n, %events --
  span        NUMBER         1         -- COL attributes affect N columns --
  width       %MultiLength;  #IMPLIED  -- column width specification --
  %cellhalign;                         -- horizontal alignment in cells --
  %cellvalign;                         -- vertical alignment in cells --
  >

 <COL> の SPAN 属性の既定値は“1”であると示されている。HTML の DTD では,既定値ではなくキーワード #IMPLIED#REQUIRED が入ることが多い。

 #IMPLIED の場合の既定値は明示されない。UA が定めるものであったり,状況によって決まることもあったりする。明示できないような値が既定値となる場合は,#IMPLIED が書かれた上で規格書で既定値が定められることもある。HTML においては,属性値としてのキーワードが属性名と同じで,かつ 1 つしか候補がなく,#IMPLIED が書かれたものはブール値を与える属性となり,一般に属性値のみを与えることになる。さきほどの <IMG> の ISMAP 属性はブール値を与える属性であることを思いだそう。

 #REQUIRED では属性は必須で,必ず与えなくてはならない。

 HTML の DTD では,前述したように,値の意味的な種類を区別するために,同じデータタイプに,パラメータ実体参照によってさまざまな別名を与えている。以下に,よく現れるものを掲げておく。

属性値のデータタイプとパラメータ実体
パラメータ実体 参照されるデータタイプ 与えられている“意味”
ContentType CDATA MIME タイプ。
ContentTypes CDATA MIME タイプ(複数可)。カンマで区切る。
URI CDATA URI。
Script CDATA スクリプト。
StyleSheet CDATA スタイルシート。
Length CDATA 長さの指定。単位を伴わないとピクセルとして,パーセント記号「%」を伴う百分率として長さを与える。
MultiLength CDATA 長さの指定。ピクセル,百分率のほかに,アスタリスク「*」を伴う比例配分を用いても長さを与えられる。
MultiLengths CDATA 複数の長さの指定。MultiLength の値をカンマで区切って与える。
Pixels CDATA ピクセルを単位とした長さの指定。単位記号は伴わない。
Text CDATA テキスト。人間に意味のある文字列。

 以上が DTD の読み方の基本である。まだ細かい点もあるのだが,まずは DTD をご覧になって,“どんな定義がされているのか”つかんでいただきたい。HTML の理解の助けになるはずである。DTD をもっと詳しく読みたいというのであれば,SGML に関する書籍を参照されたい。