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>」と表示したい場合、 実体参照を使用する。
文字 | 実体参照 |
---|---|
< | < |
> | > |
& | & |
” | " |
’ | ' (XHTMLのみ) |
つまり、次のようなコードになる。
<p>abc<em>123</em>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要素、見出し要素が記述できないことも分かる。