<<PREV | TOP | NEXT>>

How to Read DTD

last modified 23rd/Oct. 2000

HTML 4 の DTD (文書型定義)は以下の三種類が有ります。 原典へのリンクと併せて、 DTD 宣言も付記しておきます;

HTML 4 Strict DTD
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN"
            "http://www.w3.org/TR/html4/strict.dtd">
HTML 4 Transitional DTD
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"
        "http://www.w3.org/TR/html4/loose.dtd">
HTML 4 Frameset 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 の内容は次の四つに分けられます;

DTD コメント
DTD の読み手のための参考情報がコメントとして記述されています。
パラメタ実体定義
DTD の簡便化のために複数の要素や属性、属性値の集合をパラメタ実体として定義します。
要素の宣言
HTML 文書で利用できる要素の内容やタグの省略可能性を定義します。
属性の宣言
要素毎に、その取り得る属性が定義されています。属性の種類とその値が定義されます。

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)
内容モデル無し (EMPTY)
コメント(参考情報)Embedded image

内容モデルが EMPTY である要素を空要素と呼びます。このとき、終了タグは省略可能 (O; Optional) とされていますが、必ず省略されなければなりません。

XHTML 1.0 では終了タグは必ず存在する必要が有ります。空要素の場合は、 <br /> のように、開始タグの末尾を /> と書く事で終了タグの意味も持たせます。

<!ELEMENT DL - - (DT|DD)+              -- definition list -->
宣言されている要素DL
タグの省略可能性開始タグ必須 (-)、終了タグ必須 (-)
内容モデルDT 要素か DD 要素を任意の順序で (DT|DD) 一回以上 (+)
コメント(参考情報)definition list

内容モデルの指定方法を紹介します;

( ... )
グループの範囲。
A
A は 1 回のみ出現しなければならない。
A+
A は 1 回以上出現しなければならない。
A?
A は 0 回または1回のみ出現しなければならない。
A*
A は 0 以上の回数出現してよい。
+(A)
A が出現してよい。
-(A)
A は出現してはならない。
A | B
A と B のどちらか一方が出現しなければならないが、双方同時ではない。
A , B
A と B がこの順序で出現しなければならない。
A & B
A と B が必要だが、順序は問わない。

ここで AB は、要素かパラメタ実体が考えられます。具体例を見てみましょう;

<!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 が指定された属性の場合、デフォルト値はブラウザに依存する場合、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 の中では展開されます。

パラメタ実体 %i18n;

<!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; は、 langdir に展開されます。

lang 属性は、属性値に許される型が %LanguageCode; で、初期値の存在が暗示されています。コメント language code から、言語を指定する属性であることが伺えます。

dir 属性は、属性値が明示されており、許される属性値はキーワードで trrt の何れか一方です。初期値の存在が暗示されており、コメントからテキスト方向が明示されていない場合に、テキスト方向を指定する属性であることが伺えます。

因みに、 %Languagecode; は次のよう定義されています;

<!ENTITY % LanguageCode "NAME"
    -- a language code, as per [RFC1766]
    -->

仕様によって、 NAME は次のような型であることが定義されています;

W3C HTML Specification より

%i18n; に含まれる属性の利用法に付いては、 %i18n; の説明 を参照下さい。

パラメタ実体 %attrs;

パラメタ実体 %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 属性

属性の中には、 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 要素の要素宣言と属性宣言です。ここで、 selecteddisable が 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 をまとめました。

<<PREV | TOP | NEXT>>

FC2> モビット