last modified 23rd/Oct. 2000
HTML 4 の DTD (文書型定義)は以下の三種類が有ります。 原典へのリンクと併せて、 DTD 宣言も付記しておきます;
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN" "http://www.w3.org/TR/html4/strict.dtd">
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Frameset//EN" "http://www.w3.org/TR/html4/frameset.dtd">
他に、文字実体参照を定義した DTD がこれらこれらの中で参照されています。これらは何れも W3C が策定しており、 DTD は W3C の HTML 4 仕様書 に含まれています。
これらの HTML DTD は HTML 文書の要素構造や属性に付いての文法的な定義を与えています。文書記述者は、目的に応じて適切な DTD を選び、これに則って文書を作成することになります。
DTD の内容は次の四つに分けられます;
HTML 4 Strict DTD を例にとって、順番に紹介します。
DTD のコメントは前後を --
で括られています;
<!-- HTML has two basic content models: %inline; character level elements and text strings %block; block-like elements e.g. paragraphs and lists -->
この書き方は HTML でも利用されます。他に、 DTD では次の書き方が頻出します;
<!ELEMENT BODY O O (%block;|SCRIPT)+ +(INS|DEL) -- document body -->
これは BODY 要素の要素宣言ですが、末尾に document body
というコメントが付け加えられています。 BODY 要素の意味を補足するための参考情報です。
DTD は要素と属性を定義しますが、複数の要素や属性、属性値の集合を「パラメタ実体」として定義することで記述の便宜を図っています。パラメタ実体定義は <!ENTITY %
と云うキーワードから始まり、 >
で閉じられます。
次の例は、パラメタ実体 %html.content;
の定義です;
<!ENTITY % html.content "HEAD, BODY">
%html.content
は、 HEAD 要素と BODY 要素に展開されます。即ち、 HEAD 要素と BODY 要素を併せた集合が %html.content
であると云うことです。
次の例は、パラメタ実体 %flow;
の定義です;
<!ENTITY % flow "%block; | %inline;">
パラメタ実体 %flow;
は、更に別のパラメタ実態に展開されています。 %block;
と %inline;
を併せた集合として定義されていることになります。
更に %block;
と %inline;
の定義を挙げます;
<!ENTITY % block "P | %heading; | %list; | %preformatted; | DL | DIV | NOSCRIPT | BLOCKQUOTE | FORM | HR | TABLE | FIELDSET | ADDRESS"> <!ENTITY % inline "#PCDATA | %fontstyle; | %phrase; | %special; | %formctrl;">
ここで初めて要素名が現れました。しかし、まだ展開されていないパラメタ実体も残っています。この中から、例として %special;
の定義を挙げます;
<!ENTITY % special "A | IMG | OBJECT | BR | SCRIPT | MAP | Q | SUB | SUP | SPAN | BDO">
このようにしてパラメタ実体を次々に展開していけば、最終的な文字列は要素名、属性名、属性値のいずれかに帰着します。
また、属性の値として許されるタイプもパラメタ実体で定義されている場合があります。例えば、
DTD の要素宣言は、 <!ELEMENT
から始まり、 >
で閉じられます。
要素宣言は、 要素名、省略可能性、内容モデル、コメントの四つの部分からなります;
<!ELEMENT HTML O O (%html.content;) -- document root element -->
これは HTML 要素の定義ですが、次のように読むことが出来ます;
宣言されている要素 | HTML |
---|---|
タグの省略可能性 | 開始タグ省略可 (O )、終了タグ省略可 (O ) |
内容モデル | %html.content; が一度だけ現れなければならない。 |
コメント(参考情報) | document root element |
内容モデルとは、当該要素の内容として許されるもののことです。今の場合は、 <html>
と </hmtl>
の間には、パラメタ実体 %htmlcontent; で定義される要素が一度だけ現れなければならないことを示しています。
XHTML 1.0 では終了タグは必ず存在する必要が有ります。省略は許されません。
<!ELEMENT IMG - O EMPTY -- Embedded image -->
宣言されている要素 | IMG |
---|---|
タグの省略可能性 | 開始タグ必須 (- )、終了タグ省略可 (O ) |
内容モデル | 無し ( |
コメント(参考情報) | Embedded image |
内容モデルが EMPTY
である要素を空要素と呼びます。このとき、終了タグは省略可能 (O
; Optional) とされていますが、必ず省略されなければなりません。
XHTML 1.0 では終了タグは必ず存在する必要が有ります。空要素の場合は、 <br />
のように、開始タグの末尾を />
と書く事で終了タグの意味も持たせます。
<!ELEMENT DL - - (DT|DD)+ -- definition list -->
宣言されている要素 | DL |
---|---|
タグの省略可能性 | 開始タグ必須 (- )、終了タグ必須 (- ) |
内容モデル | DT 要素か DD 要素を任意の順序で ( |
コメント(参考情報) | definition list |
内容モデルの指定方法を紹介します;
ここで A
と B
は、要素かパラメタ実体が考えられます。具体例を見てみましょう;
<!ELEMENT UL - - (LI)+>
UL 要素は、 LI 要素を一度以上 (one or more) 内容に持たなければならない。
<!ELEMENT DL - - (DT|DD)+>
DL 要素は、 DT 要素か DD 要素を任意の順序で一回以上 (one or more DT or DD elements in any order) 内容に待たなければならない。
<!ELEMENT A - - (%inline;)* -(A)>
A 要素は、パラメタ実体 %inline; をゼロ回以上内容に持ち得るが、 A 要素は別の A 要素の内容として現れてはならない (-(A)
) 。
A 要素はパラメタ実体 %inline;
の一部ですが、 -(A)
によって排除されていることに注意してください。 A 要素の入れ子(ネスト)は不正です。
<!ELEMENT FORM - - (%block;|SCRIPT)+ -(FORM)>
この例では、 FORM 要素のネストが不正で有る事を宣言しています。
要素の取り得る属性の宣言は、 <!ATTLIST
から始まり、 >
で閉じられます。
属性宣言では、対象となる要素、定義される属性のリストを含み、属性定義のリストは次の三つの情報を含みます;
#IMPLIED
、値の指定が必須である場合 #REQUIRED
、固定値を持つ場合 #FIXED
の分類#IMPLIED
が指定された属性の場合、デフォルト値はブラウザに依存する場合、DTD に明示されている場合、親要素から継承する場合が考えられます。
<!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 -- >
これは IMG 要素の属性宣言です。 src 属性と alt 属性が必須とされています。 ismap 属性は属性値が ismap のみしか許されていません。このような属性を boolean 属性と呼びます。
属性 %attrs;
や、属性値の型 %URI
, %Text;
などのパラメタ実体は DTD の中では展開されます。
<!ATTLIST HTML %i18n; -- lang, dir -- >
HTML 要素の属性宣言です。属性リストに、パラメタ実体 %i18n
が現れています。
パラメタ実体 %i18n の定義を挙げます;
<!ENTITY % i18n "lang %LanguageCode; #IMPLIED -- language code -- dir (ltr|rtl) #IMPLIED -- direction for weak/neutral text --" >
%i18n;
は、 lang
と dir
に展開されます。
lang 属性は、属性値に許される型が %LanguageCode;
で、初期値の存在が暗示されています。コメント language code
から、言語を指定する属性であることが伺えます。
dir 属性は、属性値が明示されており、許される属性値はキーワードで tr
か rt
の何れか一方です。初期値の存在が暗示されており、コメントからテキスト方向が明示されていない場合に、テキスト方向を指定する属性であることが伺えます。
因みに、 %Languagecode; は次のよう定義されています;
<!ENTITY % LanguageCode "NAME" -- a language code, as per [RFC1766] -->
仕様によって、 NAME は次のような型であることが定義されています;
%i18n;
に含まれる属性の利用法に付いては、 %i18n; の説明 を参照下さい。
パラメタ実体 %i18n;
は DTD に頻出しますが、それ以上に、パラメタ実体 %attrs;
が頻出します;
<!ATTLIST BODY %attrs; -- %coreattrs, %i18n, %events -- onload %Script; #IMPLIED -- the document has been loaded -- onunload %Script; #IMPLIED -- the document has been removed -- >
BODY 要素の属性宣言です。属性リストに、 パラメタ実体 %attrs;
と、属性 onload
, onunload
が現れています。
%attrs;
を展開します;
<!ENTITY % attrs "%coreattrs; %i18n; %events;">
%i18n;
は %attrs;
に含まれます。他に、 %coreattrs;
, %events;
が %attrs;
に含まれます。
%attrs;
に現れている %coreattrs;
を展開してみます;
<!ENTITY % coreattrs "id ID #IMPLIED -- document-wide unique id -- class CDATA #IMPLIED -- space-separated list of classes -- style %StyleSheet; #IMPLIED -- associated style info -- title %Text; #IMPLIED -- advisory title --" >
パラメタ実体 %attrs;
は、このような属性がほとんどすべての要素に定義されているので、簡便化のために定義されたものです。
属性の中には、 Boolean 属性に分類されるものがあります。開始タグ中に現れると、属性値が「真」 (true) であると解釈され、現れなければ「偽」 (false) であると解釈されます。
Boolean 属性は、属性値として、自身の属性名だけしか許されません。(例えば、 selected="selected"
となります)。
<!ELEMENT OPTION - O (#PCDATA) -- selectable choice --> <!ATTLIST OPTION %attrs; -- %coreattrs, %i18n, %events -- selected (selected) #IMPLIED disabled (disabled) #IMPLIED -- unavailable in this context -- label %Text; #IMPLIED -- for use in hierarchical menus -- value CDATA #IMPLIED -- defaults to element content -- >
OPTION 要素の要素宣言と属性宣言です。ここで、 selected
と disable
が Boolean 属性です。
<option selected="selected"> …contents… </option>
Boolean 属性は minimalized form と云う形式で指定できます。これは、 Boolean 属性の属性値だけを開始タグに単独で記述する形式です。今の場合は;
<OPTION selected>
ブラウザの種類によっては、 minimalized form だけしか解釈できないで、 selected="selected"
と云う full form を解釈できないものも多く存在することに注意してください。
しかし、XHTML 1.0 では属性の省略は許されません。必ず attr="value"
の形で記述する必要が有ります。
次に、ここでまとめた DTD の読み方にしたがって、ブロック要素とインライン要素に付いての DTD をまとめました。