DTDを読んでみましょう
DTDは何故必要か
私達がHTML文書を書く上で、文字列毎全てに適切な要素を割り当て、マークアップをしていますが、実は、そこには元となる規則
(W3Cが定めた文書型定義)が存在しているのです。HTMLのDTDに書いてある事が一番正確なHTMLの仕様書でもあるからです。
そのDTD(文書型定義)は幾つかのルールを覚えれば読めない事もありません。
(以下 HTML 4.01 Transitional について話を進めます。)
DTDは何処にあるの
URI:http://www.w3.org/TR/1999/PR-html40-19990824/ にアクセスしてみてください。
「W3C HTML 4.01 Specification」 が開きます。
「Quick Table of Contents」の「22.Transitional Document Type Definition」 を開いてみましょう。
はじめにHTMLの基本構造が示してあります。1行目は、DTD文書型指定で、ここでは、HTML 4.01 Transitional英語版を指定しています。
2行目は、その文書型の外部フアイル参照です。
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"
"http://www.w3.org/TR/html40/loose.dtd">
<html>
<head>
...
</head>
<body>
...
</body>
</html>
DTDの内容
HTMLのDTDは、多数の宣言から構成されています。その内容は、 どんな構成要素があるのか 要素の出力順序、出現回数 要素の親子関係
の定義などから成り立っています。
DTDの構成
ページをダウンして眺めると、矢鱈と[<!ENTITY %...]が並んでいます。これは、「パラメータ実体定義」と言いまして、
属性や値の名称(実体名)を定義している部分です。これが、要素や属性の説明段階で、「パラメータ実体参照」により繰り返し、
繰り返し参照されることになります。
そこで、DTDの構成は、「パラメータ実体定義」「要素宣言」「属性宣言」の3つから構成されていると言うことができます。
1/4程経過した、<!--===== Document Body =====-->から、各要素の宣言と、その要素に対する属性の宣言があります。
(もう、[<!ENTITY %...]の用語は殆ど見当たらなくなります。)
Document Bodyの2つ上の<!--=====Text Markup=====-->欄にも数個の要素記述があります、[br] 要素はその中にあります。
下に[p]要素と[br]要素の記述例を2つ程挙げました。
----------------------------------------------------------------------
<!ELEMENT P - O (%inline;)* -- paragraph -->
<!ATTLIST P
%attrs; -- %coreattrs, %i18n, %events --
%align; -- align, text alignment --
>
----------------------------------------------------------------------
<!ELEMENT BR - O EMPTY -- forced line break -->
<!ATTLIST BR
%coreattrs; -- id, class, style, title --
>
----------------------------------------------------------------------
第1行目は要素の宣言です。
要素の宣言は <!キーワード...>の形で行われます。
- 「< 」は開始区切り子です。
- キーワードは【!ELEMENT】です。
- 次、要素名
- 次、開始タグ [-]は必須、[o]は省略可を表します。
- 次、終了タグ [-]は必須、[o]は省略可を表します。
- 次、要素の定義の最後は「内容モデル」の指定です。
内容モデル
別途定義された要素型名や実体名を使って、「子の要素」を指定すると共に、どんな順序で何回出現できるかを定義します。
これによって要素の親子関係が決まります。出現順序や回数は下記のような記号(演算子)で表示します。
上記 P 要素のようにパラメータ実体参照を含むものもあります。)
- 次、DTD全般に渡って使用される、両端を[--]に囲まれた文字列(-- 文字列 --)は単なるコメントに過ぎず、
DTD の宣言に直接関係ありません。
- 行末は「>」で、「要素宣言」が終了します。
「内容モデル」の出現順序、出現回数
- (...) :括弧内の...で示す要素をグループ化します。
- 要素A :要素A が1回のみ出現しなければなりません。
- 要素A+ :要素A は1回以上出現しなければなりません。
- 要素A? :要素A が現れないか、1回のみ出現する。
- 要素A* :要素A が現れないか、任意回数出現しても良い。
- +(要素A) :要素A はその子孫にわたって出現して良い。
- -(要素A) :要素A はその子孫にわたって出現してはなりません。
- 要素A | 要素B :要素A と要素B のどちらかが出現しなければなりません。双方同時に出現してはいけません。
- 要素A , 要素B :要素A と要素B がこの順序で出現しなければなりません。
- 要素A & 要素B :要素A と要素B が必要だが、任意の順序で出現して良い。
第2行目は当該要素に対する属性の宣言です。
属性の宣言は <!キーワード...>の形で行われます。
(パラメータ実体参照から始まるものもあります。)
- 「< 」は開始区切り子です。
- キーワードは【!ATTLIST】です。
- 次、要素名、([!ATTLIST 要素名]で 当該要素が取り得る属性を宣言しています。)
第3行目は各属性の定義です。
上の[p],[br]要素の場合は【%attrs;】とか【%coreattrs;】のように、共に「パラメータ実体参照」で始まっています。
しかし、9割以上が【%attrs;】で始まります。
パラメータ実体参照
キーワードは【%...;】(...は実体名)で、この形で表示されるものを、「パラメータ実体参照」といいます。
[%]はDTD構成の「実体の定義」で既に定義済みのものを参照せよの意味です。リンク機能が付いています。
文字実体参照 &...; 同様,最後のセミコロンは省略可能です。
パラメータ実体参照から導かれる、パラメータ実体の定義
「パラメータ実体参照」の参照先には、「パラメータ実体」が表示されます。
キーワードは【<!ENTITY % ... "...">】です。%から半角スペースをおいて(...)は実体名です。この中でも更にパラメータ実体参照が含まれるものもあり、
次々へと展開されていきます。
- その後に、属性名が並びます。(その中には、また、パラメータ実体参照が含まれるものがあります。)
属性名1 属性の値1 属性省略時の値1
属性名2 属性の値2 属性省略時の値2
属性名3 属性の値3 属性省略時の値3
- 最後の行は「>」で、「属性宣言」が終了します。
「属性の値」と「属性省略時の値」
- 「属性の値」には、属性として指定できる特定の値やデータ型を指定します。
- 「属性省略時の値」には、属性が省略された場合の値や、省略の可否や解釈に関するキーワードを指定します。
キーワード[#REQUIRED]は、省略は不可です。
キーワード[#IMPLIED]は、省略された場合はアプリケーションに依存にになることを示しています。
キーワード[#FIXED]は、このキーワードに続く値に固定
このシリーズで使用した要素のピックアップ
- <!ELEMENT P - O (%inline;)* -- paragraph -->
P 要素、開始タグ必須、終了タグ省略可、子要素として持てるのは、インライン要素のみで、0回以上繰り返し出現して良い。
- <!ELEMENT BR - O EMPTY -- forced line break -->
BR 要素、開始タグ必須、終了タグ付けてはならい。空要素で、内容を持たない。
- <!ELEMENT IMG - O EMPTY -- Embedded image -->
IMG 要素、開始タグ必須、終了タグ付けてはならない。空要素で、内容を持たない。
- <!ELEMENT A - - (%inline;)* -(A) -- anchor -->
A 要素、開始タグ必須、終了タグ必須、子要素として持てるのは、インライン要素のみで、0回以上繰り返し出現して良い。
ただし、A 要素はその子孫にわたって出現してはなりません。
- <!ELEMENT BODY O O (%flow;)* +(INS|DEL) -- document body -->
BODY 要素、開始タグ省略可、終了タグ省略可、ブロックレベルタグ、インラインレベルタグを子要素として持てて、
0回以上繰り返し出現して良い。(strict.dtd からは、インラインレベルタグを子要素に持てなくなりました。)
INS|DELですが、文書の修正で、INS は挿入された部分を、DEL は削除された部分を表します。
。BODY要素の子要素の中にも孫要素の中にも書くことができ、その場所によってブロック要素として、
また、インライン要素として振る舞います。
- <!ELEMENT FRAMESET - - (FRAMESET|FRAME)+ & NOFRAMES?) -- window subdivision-->
FRAMESET 要素、開始タグ必須、終了タグ必須、FRAMESET要素の子として、FRAMESET要素またはFRAME要素のうちどちらか1つが、
1回以上繰り返し出現します。FRAMESETまたはFRAME、FRAMESETまたはFRAMEのように出現します。[NOFRAMES?]は「現れないか、1回のみ出現する。
- <!ELEMENT FRAME - O EMPTY -- subwindow -->
FRAME 要素、開始タグ必須、終了タグ付けてはならない。空要素で、内容を持たない。
- <!ELEMENT OL - - (LI)+ -- ordered list -->
OL 要素、開始タグ必須、終了タグ必須、LI要素が1回以上出現します。
- <!ELEMENT UL - - (LI)+ -- unordered list -->
UL 要素、開始タグ必須、終了タグ必須、LI要素が1回以上出現します。
- <!ELEMENT LI - O (%flow;)* -- list item -->
LI 要素、開始タグ必須、終了タグ省略可、ブロックレベルタグ、インラインレベルタグを子要素として持てて、
0回以上繰り返し出現して良い。
- <!ELEMENT DL - - (DT|DD)+ -- definition list -->
DL 要素、開始タグ必須、終了タグ必須、DL要素の子として、DT要素またはDD要素のうちどちらか1つが、
1回以上繰り返し出現します。DTまたはDD、DTまたはDD、DTまたはDDのように出現します。
- <!ELEMENT DT - O (%inline;)* -- definition term -->
DT 要素、開始タグ必須、終了タグ省略可、子要素として持てるのは、インライン要素のみで、0回以上繰り返し出現して良い。
- <!ELEMENT DD - O (%flow;)* -- definition description -->
DD 要素、開始タグ必須、終了タグ省略可、ブロックレベルタグ、インラインレベルタグを子要素として持てて、
0回以上繰り返し出現して良い。
- <!ELEMENT TABLE - - (CAPTION?, (COL*|COLGROUP*), THEAD?, TFOOT?, TBODY+)>
TABLE 要素、開始タグ必須、終了タグ必須、CAPTION、THEAD、 TFOOTは現れないか、1回のみ出現する。
COLとCOLGROUPは現れないか、任意回数出現しても良い。双方同時に出現してはいけません。
TBODYは1回以上出現しなければなりません。となっていますが、開始、終了タグ省略可です。
- <!ELEMENT CAPTION - - (%inline;)* -- table caption -->
CAPTION 要素、開始タグ必須、終了タグ必須、子要素として持てるのは、インライン要素のみで、0回以上繰り返し出現して良い。
- <!ELEMENT THEAD - O (TR)+ -- table header -->
THEAD 要素、開始タグ必須、終了タグ省略可、TR 要素が1回以上出現します。
- <!ELEMENT TFOOT - O (TR)+ -- table footer -->
TFOOT 要素、開始タグ必須、終了タグ省略可、TR 要素が1回以上出現します。
- <!ELEMENT TBODY O O (TR)+ -- table body -->
TBODY 要素、開始タグ、終了タグ省略可、TR 要素が1回以上出現します。
- <!ELEMENT TR - O (TH|TD)+ -- table row -->
TR 要素、開始タグ必須、終了タグ省略可、TR要素の子として、TH要素またはTD要素のうちどちらか1つが、
1回以上繰り返し出現します。THまたはTD、THまたはTD、THまたはTDのように出現します。
- <!ELEMENT (TH|TD) - O (%flow;)* -- table header cell, table data cell-->
TH要素とTD要素、開始タグ必須、終了タグ省略可、ブロックレベルタグ、インラインレベルタグを子要素として持てて、
0回以上繰り返し出現して良い。
まとめ
- タグはすべて要素宣言、キーワード【!ELEMENT】で定義されています。
そこで、知りたい要素を探しましょう。
- パラメータ実体参照を使って内容を定義するものがありますから、キーワード【%実体名;】が出てきたら、クリックして、
キーワード【!ENTITY % 実体名】 という実体宣言を調べます。
- 更に、そこでもまた、実体参照が使われている場合もあります。その時は理解できるまでその実体を遡る必要があります。
トップへ戻る
スタイルシート目次へ戻る
フォームへ戻る
XHTMLへの移行へ進む