ここでは,HTML の DTD を読む基礎を解説しよう。DTD の理解は,HTML の深い理解につながるだろう。また,HTML が改訂されても,その概要を DTD からつかむこともできる。さらには,SGML 全般への橋渡しにもなるだろう。
DTD は Section 10 でその一部をご覧いただいたが,この DTD 全体は,多数の宣言からなっている。宣言は,
<! ... >
という,HTML のコメントからハイフンを取り除いたかたちをしている。宣言の中では,2 個の連続したハイフンからその次の 2 個の連続したハイフンまではコメントと見なされる。
宣言の中では,よく使う値を定義し,簡単な名前で呼び出せるようにしたパラメータ実体参照を用いることがある。パラメータ実体参照は,
%...;
のようなかたちで行われる。文字実体参照とよく似ているが,先頭につく記号がアンパサンドではなくパーセント「%」である。文字実体参照同様,最後のセミコロンは省略されることもある。
HTML の DTD はおもに 3 つの種類の宣言からなっている。
これらを順に見ていこう。
パラメータ実体の定義は,
<!ENTITY % ... "...">
という構文である。パーセント記号に続いてパラメータ実体の名前,そしてその定義である。この定義は上に見るように引用符でくくられる。それ以降,その名前によって参照されるパラメータは引用符にくくられた文字列に展開される。
たとえば,次のような定義
<!ENTITY % heading "H1|H2|H3|H4|H5|H6">
をしてある状態で,次の記述
<!ELEMENT (%heading;) - - (%inline;)* -- heading -->
にある %heading; は展開され,
<!ELEMENT (H1|H2|H3|H4|H5|H6) - - (%inline;)* -- heading -->
となる(ちなみに,そのあとの“%inline;”もパラメータ実体参照であり,どこかで定義された値に展開される)。念のために言っておくと,後半の“-- heading --”はコメントであり,DTD の宣言に直接関係はない。
パラメータ実体の定義には,パラメータ実体参照を用いてもよい。ここで,定義の中に含まれていたパラメータ実体参照も(再帰的に)展開される。たとえば,
<!ENTITY % block "P | %heading; | %list; | %preformatted; | DL | DIV | NOSCRIPT | BLOCKQUOTE | FORM | HR | TABLE | FIELDSET | ADDRESS">
で定義される %block; が展開されると,その中の %heading;,%list;,%preformatted; も展開される。
要素は,次のように定義される。
<!ELEMENT Q - - (%inline;)* -- short inline quotation -->
ELEMENT に続くのはまず要素名である。ここでは,<Q> を定義している。2 つ以上の要素を同時に定義する場合は,かっこでくくり,要素をセパレータ | で区切る。
<!ELEMENT (INS|DEL) - - (%flow;)* -- inserted text, deleted text -->
次にハイフンが 2 個並んでいるが,これは順に開始タグ・終了タグの省略の可否を表している。ハイフン「-」は“省略不可”,「o」または「O」(アルファベットの“オー”)は“省略可”を表す。現に,終了タグがよく省略されている“箇条書きの項目”を表す要素 <LI> は,DTD 中で
<!ELEMENT LI - O (%flow;)* -- list item -->
のように,終了タグが“省略可”の“O”になっている。<HEAD> のように,開始タグ・終了タグともに省略可のものもある。
<!ELEMENT HEAD O O (%head.content;) +(%head.misc;) -- document head -->
ただし,<TBODY> のように,“O O”と書かれてあっても,仕様書によって“開始タグは条件付きで省略可”となっているものもある。この“条件付き”が DTD に表せないので,仕様書で補っているということになる。
その次に書かれるのは内容モデル(内容として書けるデータタイプ・要素)である。内容をとらないエンプティ要素は,ここがキーワード EMPTY になる。このとき,タグの省略可否の部分は“- O”になるが,“終了タグ省略可”に対応する“O”は“省略可”ではなく“禁止”の意味になる。
それ以外の場合,この部分に入るのは順序や出現回数を表す記号を伴った要素名(パラメータ実体参照のこともある)や SGML におけるデータタイプである。
SGML のデータタイプで,内容モデルの定義で出てくるのは
である。これらと要素名を記号で組み合わせて,内容モデルの定義がなされ,これが全体として HTML の文書モデルを作り上げる。記号との組み合わせについては,次の Section で触れることにしよう。