DTD(文書型定義)の読み方

DTDって?

DTDは、HTMLなどSGMLを基にする言語にどのような要素があって、どんな条件で 使うことができるかといったルールを定義したものです。

要素宣言

DTDでは、文書中で使用する要素がどのような構造かを<!ELEMENT・・・>で定義します。

<!ELEMENT 要素名 開始タグ要求 終了タグ要求 (内容モデル) -- コメント -->

例えば、address要素の場合、次のように定義されます。

<!ELEMENT ADDRESS - - (%inline;)* -- information on author -->

address要素の定義

定義項目意味
要素名address
タグの要求開始タグ省略不可(-),終了タグ省略不可(-)
内容モデル%inline;が現れないか、任意回数出現しなければならない。
コメントinformation on author
要素名
要素名には、見出しや段落といったタグの名称を定義します。
タグ要求
タグ要求には、開始タグや終了タグが必須かどうかを定義します。 -が必須、Oが省略可を表します。
内容モデル
定義対象の要素内で出現可能な内容(実体やパラメータ実体)や回数、順序、例外などを定義します。
コメント
要素のコメントが記述されます。

内容モデルの表記方法

内容モデル 意味
A Aは1回だけ現れなければならない。
A+ Aは1回以上出現しなければならない。
A? Aは現れないか、1回だけ現れなければならない。
A* Aは現れないか、任意回数出現する。
A | B AもしくはBのいずれか一方が出現しなければならない。
A, B A及びBがこの順序で出現しなければならない。
A&B A及びBが任意の順序で出現しなければならない。
+( ... ) 要素グループは、例外として出現して良い
-( ... ) 要素グループは、例外として出現してはいけない
( ... ) グループの範囲を指定する
EMPTY 内容を持ってはならない
#PCDATA 文字列

ここまでの内容を、body要素で確認してみます。

<!ELEMENT BODY O O (%block;|SCRIPT)+ +(INS|DEL) -- document body -->

body要素は、開始タグの要求がO終了タグの要求もOなのでタグは省略可能であることを示しています。 内容モデルでは、ブロックレベル要素(%block;)もしくはscript要素が1回以上出現でき、 例外としてins,del要素は、body要素内に出現してもかまいません。

内容モデルに%block;というものが記述されていますが、これはパラメータ実体と言います。

パラメータ実体

パラメータ実体は、DTD内でのみ参照され複数の要素のまとまりや属性のまとまり等に 別名を付けて定義します。

例えば、body要素で宣言された%block;は、次のように定義されています。

<!ENTITY % block
     "P | %heading; | %list; | %preformatted; | DL | DIV | NOSCRIPT |
      BLOCKQUOTE | FORM | HR | TABLE | FIELDSET | ADDRESS">

上記のように、body要素で宣言された%block;を展開すると%block;には、p要素やdl,div,...等が含まれていると 定義されています。 また、その先にには%heading;のように別の場所に宣言されている要素も含まれます。

<!ENTITY % heading "H1|H2|H3|H4|H5|H6">

%heading;のような定義をパラメータ実体といいます。

属性宣言

DTDでは、各要素の属性を<!ATTLIST・・・>で定義します。。

<!ATTLIST 要素名 属性名 データ型または値 デフォルト値または属性の要求>

例えば、img要素の場合、次のように定義されます。

<!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 --
>

%attrs;は、パラメータ実体として定義されDTDの中で確認できます。 srcとalt属性は、必須(#REQUIRED)として定義されています。 ismap属性は、値としてismapのみ持つことができます。

以上のように、各要素の属性はDTDの中で<!ATTLIST・・・>で定義されます。