Section 13 : DTD を読む(1)

 ここでは,HTML の DTD を読む基礎を解説しよう。DTD の理解は,HTML の深い理解につながるだろう。また,HTML が改訂されても,その概要を DTD からつかむこともできる。さらには,SGML 全般への橋渡しにもなるだろう。

DTD の記法

 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 -->
DTD 中で,要素は,種類名,タグの省略可否,内容モデルによって定義される。
図 13.1 [D]

ただし,<TBODY> のように,“O O”と書かれてあっても,仕様書によって“開始タグは条件付きで省略可”となっているものもある。この“条件付き”が DTD に表せないので,仕様書で補っているということになる。

 その次に書かれるのは内容モデル(内容として書けるデータタイプ・要素)である。内容をとらないエンプティ要素は,ここがキーワード EMPTY になる。このとき,タグの省略可否の部分は“- O”になるが,“終了タグ省略可”に対応する“O”は“省略可”ではなく“禁止”の意味になる。

 それ以外の場合,この部分に入るのは順序や出現回数を表す記号を伴った要素名(パラメータ実体参照のこともある)や SGML におけるデータタイプである。

 SGML のデータタイプで,内容モデルの定義で出てくるのは

#PCDATA
文字参照を含むテキスト。通常のテキストと解釈していただいても差し支えはなかろう。
CDATA
HTML 4 においては,<SCRIPT><STYLE> がこのデータタイプで,終了タグ開始区切り子</”の直前までを“そのまま(as is)”でスクリプトのインタプリタもしくはスタイルシートの解析エンジンに渡す。したがって,この中では文字参照は使えない。逆に,“</”によって要素の内容は終わったと解釈されるので,前述のように終了タグ以前に“</”が出てくるのは危険である。

である。これらと要素名を記号で組み合わせて,内容モデルの定義がなされ,これが全体として HTML の文書モデルを作り上げる。記号との組み合わせについては,次の Section で触れることにしよう。