13. DTDの読み方(要素編)

DTDにもいろいろな種類があるが、ここではXHTML 1.0 の strict.dtd を例に説明を進める。

要素の定義

DTDでの要素定義は、「<!ELEMENT」で始まる部分を探す。 その部分は、次の形式で記述されている。

<!ELEMENT 要素名 内容モデル>

以下に例を示す。

<!ELEMENT p %Inline;>

<!ELEMENT h1 %Inline;>
<!ELEMENT h2 %Inline;>
<!ELEMENT h3 %Inline;>
<!ELEMENT h4 %Inline;>
<!ELEMENT h5 %Inline;>
<!ELEMENT h6 %Inline;>

<!ELEMENT br EMPTY>

<!ELEMENT em %Inline;>
<!ELEMENT strong %Inline;>
<!ELEMENT dfn %Inline;>
<!ELEMENT code %Inline;>
<!ELEMENT samp %Inline;>
<!ELEMENT kbd %Inline;>
<!ELEMENT var %Inline;>
<!ELEMENT cite %Inline;>
<!ELEMENT abbr %Inline;>
<!ELEMENT acronym %Inline;>
<!ELEMENT q %Inline;>
<!ELEMENT sub %Inline;>
<!ELEMENT sup %Inline;>

要素名

要素名で指定されたものがタグを指定する場合の名前となる。

内容モデル

内容モデルは、その要素が持つことができる他の要素を定義している。 ここに「EMPTY」と記述されている場合、その要素は、空要素を意味する。 つまり、EMPTY以外の指定がある場合、その要素は、必ず開始タグと終了タグを持つことになる。

<!ELEMENT br EMPTY>

EMPTY以外の内容モデルは、以下の書式で定義される。

書式意味
a a要素を必ず1個持つ(必須ということ)ことを意味する。
a? a要素を0個または1個持つ(オプションということ)ことを意味する。
a+ a要素を必ず1個以上持つ(必須ということ)ことを意味する。
a* a要素を0個以上持つ(任意ということ)ことを意味する。
a , b a要素の次にb要素が出現することを意味する。
a | b a要素とb要素が任意の順序で出現することを意味する。
#PCDATA 解析対象となる文字列を意味する。

解析対象文字列(#PCDATA)とは、タグその他の文字列を含んだもので、 もし、それがタグであれば要素と解釈し、そうでなければ単純な文字列と解釈される文字列を意味する。 例えば、

<p>abc<em>123</em>def</p>

の場合、最初に全体が解析対象となりp要素と解析される。 次にその内容「abc<em>123</em>def」が解析され、次のように解釈される。

abcem要素def

そのため、em要素の部分を要素ではなく文字列「<em>123</em>」と表示したい場合、 実体参照を使用する。

文字実体参照
&lt;
&gt;
&amp;
&quot;
&apos; (XHTMLのみ)

つまり、次のようなコードになる。

<p>abc&lt;em&gt;123&lt;/em&gt;def</p>

この場合は、「abcem要素def」ではなく、「<em>123</em>」のようにタグと解釈せずに単純に表示される。

パラメータ実体参照

これまでの要素のうちbr要素以外の内容モデルは、「%Inline;」と指定されている。 これはパラメータ実体参照と呼ばれるものだ。これは以下のようなルールで記述されている。

%実体名;

これによって実体名を参照し、そこで指定されている置換テキストに置き換えて定義される。 このパラメータ実体参照の置換テキスト定義は「<!ENTITY」を探す。

<!ENTITY % 実体名 "置換テキスト">

例えば、「%Inline;」は次のように定義されている。

<!ENTITY % Inline "(#PCDATA | %inline; | %misc;)*">

これにより、内容モデルには、 解析対象文字列(#PCDATA)、パラメータ実体参照(%inline; と %misc)が任意の順序で0回以上記述できることを意味する。 いま、%misc; を無視して残りの%inline;を探すと次のようになる。

<!ENTITY % inline "a | %special; | %fontstyle; | %phrase; | %inline.forms;">
同様に%special; と %phrase;について見て、残りを無視すると次のようになる。
<!ENTITY % special "br | span | bdo | object | img | map">
<!ENTITY % phrase "em | strong | dfn | code | q | sub | sup |
                   samp | kbd | var | cite | abbr | acronym">

これを逆に置き換えて行くと%Inline;は次のように置き換えられる(なお、無視した部分は含んでいない)。

<!ENTITY % Inline "(#PCDATA | br | span | bdo | object |
                   img | map | em | strong | dfn | code | q | sub | sup |
                   samp | kbd | var | cite | abbr | acronym)*">

このようにDTDを読むことにより、p要素、見出し要素のそれぞれの内側にp要素、見出し要素が記述できないことも分かる。

ページの先頭に戻る


Copyright © 2006 御隠居 (滄洲). All Rights Reserved.