2010年11月16日火曜日

ホームページを作ろう - 1.13 DTDの読み方(要素編)

1.13 DTDの読み方(要素編)

DTDにもいろいろな種類がありますが,ここではXHTML 1.0 のstrict.dtdを例に説明を進めることにします。

1.13.1 要素の定義
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;>
1.13.2 要素名
要素名で指定されたものがタグを指定する場合の名前となります。

1.13.3 内容モデル
内容モデルは,その要素が持つことができる他の要素を定義します。もし,内容モデルに「EMPTY」と記述されている場合は,その要素は,空要素であることを意味します。つまり,EMPTY以外の指定がある場合,その要素は,必ず開始タグと終了タグを持つことになる訳です。
<!ELEMENT br EMPTY>
EMPTY以外の内容モデルは,以下の書式で定義されます。
書式意味
aa要素を必ず1個持つ(必須ということ)ことを意味します。
a?a要素を0個または1個持つ(オプションということ)ことを意味します。
a+a要素を必ず1個以上持つ(必須ということ)ことを意味します。
a*a要素を0個以上持つ(任意ということ)ことを意味します。
a , ba要素の次にb要素が出現することを意味します。
a | ba要素と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>」のようにタグと解釈せずに単純な文字列として解釈されます。
1.13.4 パラメータ実体参照
これまでの要素のうち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要素,見出し要素が記述できないことも分かります。

0 件のコメント:

コメントを投稿