HTML/DTD
DTD(文書型定義)
[編集]DTD(Document Type Definition、文書型定義)は、SGML(Standard Generalized Markup Language)およびそれに基づくHTMLやXMLで、文書の構造、要素、属性、ならびにそれらの相互関係を定義するためのスキーマ言語です。
HTML4以前のHTMLはSGMLに基づいているため、DTDが不可欠でした。しかし、HTML5以降のHTMLはSGMLベースではなくなり、DTDは使用されていません。
DTDの役割
[編集]DTDの主な役割は以下の通りです:
- 文書構造の定義: HTML文書で使用可能な要素や属性を定義。
- 文法チェック: 文書が正しい構文で記述されているかを検証。
- 互換性の保証: 異なるシステム間で文書を共通フォーマットで扱えるようにする。
DTDの基本構成
[編集]DTDは、以下の要素で構成されます:
要素型宣言(Element Declaration)
[編集]HTML文書内で使用できる要素を定義します。
- 例:
<!ELEMENT title (#PCDATA)> <!ELEMENT p (#PCDATA | a | img)*>
ここでは、<title>
要素がテキストデータ(#PCDATA)のみを含むこと、<p>
要素がテキストデータや<a>
、<img>
要素を繰り返し含むことを定義しています。
属性リスト宣言(Attribute List Declaration)
[編集]要素に使用できる属性を定義します。
- 例:
<!ATTLIST img src CDATA #REQUIRED alt CDATA #IMPLIED>
この宣言は、<img>
要素がsrc
属性を必須(#REQUIRED)として、alt
属性を任意(#IMPLIED)として持つことを定義します。
エンティティ宣言(Entity Declaration)
[編集]再利用可能な文字列や記号をエンティティとして定義します。
- 例:
<!ENTITY copy "©">
このエンティティを使用することで、文書内で©
と記述するだけで「©」を挿入できます。
記号と演算子
[編集]DTDでは以下の記号を使用して構造を定義します:
,
:順序付き要素(例:(head, body)
)|
:いずれかの要素(例:(h1 | h2)
)*
:0回以上の繰り返し(例:(li)*
)+
:1回以上の繰り返し(例:(li)+
)?
:0回または1回の出現(例:(title?)
)
HTMLにおけるDTD
[編集]HTMLはバージョンによって異なるDTDを使用していました。
HTML 4.01【廃止】
[編集]HTML 4.01【廃止】では、3つのDTDが提供されています:
- Strict DTD(厳格型):
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN" "http://www.w3.org/TR/html4/strict.dtd">
- 厳格に構造化された文書用。
- Transitional DTD(遷移型):
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
- 古いHTML要素を許容。
- Frameset DTD(フレームセット型):
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Frameset//EN" "http://www.w3.org/TR/html4/frameset.dtd">
- フレームセットを使用する文書用。
XHTML【廃止】
[編集]XHTML【廃止】では、SGMLではなくXMLを基盤としていますが、DTDを使用して文書構造を定義します。
- 例:
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
HTML5以降
[編集]HTML5以降はSGMLベースではないため、DTDは使用されなくなりました。代わりに、HTML5では以下のようなシンプルなDOCTYPE宣言のみが必要です:
<!DOCTYPE html>
HTML5ではブラウザが統一されたパーサーを使用するため、DTDによる文書型の定義は不要となっています。
DTDの制限
[編集]DTDにはいくつかの制限があります:
- 型の制限: 属性値の型は簡単なもの(例:CDATA、ID)に限られ、複雑な型は定義できない。
- ネームスペースの非対応: XMLのネームスペースをサポートしていない。
- 拡張性の欠如: より柔軟なスキーマ言語(例:XML Schema、RELAX NG)の登場により、DTDの利用は減少。