文書型宣言の意味

HTML文書の先頭に記述する<!DOCTYPE ...という宣言は、その文書がどんな定義(DTD)に基づいて記述されるかを示すものです。HTMLの場合、DTDは文書とは別のところで定義されているので、外部にあるどんなDTDを使うかを宣言します。文書型宣言は文書の厳密な検証のためには重要ですが、XHTMLの場合にこれを用いると、複数の語彙を混在させるという柔軟性(拡張性)が制約されます。

HTMLの文書型宣言

ここではHTML 4.01の文書型宣言

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN">

を例に、各部分を説明します。

<!DOCTYPE HTML

この部分は、これからSGMLのDTDを宣言することを示し、その文書タイプ名が「HTML」であることを述べています。

PUBLIC

これはこのDTDが公開されたものであること(続いて記述されるのが公開識別子であること)を示します。DTDが特定のマシン上にある場合はSYSTEMが使われます。

-//W3C//DTD HTML 4.01//EN

この部分はSGMLで定められた「フォーマル公開識別子(FPI)」という書き方に従って、公開文書(ここではDTD)を特定するための情報を記述します。

フォーマル公開識別子

宣言している文書タイプを他のものと区別するのがこのFPIです。これは次のような部分から構成されます。

-//W3C
所有者識別子を示します。
//
スラッシュ2つは区切りです。
DTD
公開文種別を示します。
HTML 4.01
公開文記述を示します。
//
ここにも区切りがあります。
EN
公開文言語を示します。
所有者識別子 (OwnerID)

公開文書の所有者を示します。ISO(国際標準化機構)出版物*はその出版物番号を用います。JISなどの国家規格あるいは工業規格もしくはISO 9070に従って割り当てた所有者(登録所有者)の場合は先頭に+//を、それ以外の未登録所有者は先頭に-//を加えます。W3CはこのHTMLを策定したWorld Wide Web Consortiumを示します(HTML2.0だとIETFになります)。

公開文種別 (Public Text Class)

公開されている文書の内容を示します。この場合はDTDを公開しているわけです。必ず大文字でなければなりません。

公開文記述 (Public Text Description)

公開文書がどんなものであるかを記述します。この場合はHTMLのバージョン4.01のために公開している文書ということになります。

公開文言語 (Public Text Language)

この公開文書(つまりDTD)が記述されている言語のコードを示します。ENは英語。もし日本語で定義されたDTDならJAとなります。大文字で書くことに注意してください。なお、これはHTML本文を記述する言語とは関係ありません。

所有者識別子と公開文記述の組み合わせは、URLにおけるホスト名とローカル部の組み合わせのような役割で、この文書型を一意に特定します(もっとも未登録の所有者識別子は重複する可能性はありますが)。また、SGML Open catalogを併用すると、FPIだけでパーサに(ローカルに保存した)DTDを処理させることもできます。

このFPIをURNとして表現する方法がRFC 3151に定義されています。当サイトのURNについての簡単な説明を参照してください。

〔補足〕

ISOの出版物(規格など)の場合は、-//+//を付けず、直接ISOの出版番号などを記述します。例えばISO 15445の文書型宣言は

<!DOCTYPE HTML PUBLIC "ISO/IEC 15445:2000//DTD HTML//EN">

という具合になります。

〔以上補足〕

システム識別子について

社内文書のための定義で、DTDがローカルディスクにあるような場合、この宣言は

<!DOCTYPE myown SYSTEM "file:///HD/docs/dtd/myown.dtd">

という形になり、外部参照のIDをPUBLICではなくSYSTEMとし、システム識別子にDTDの保管場所(ファイルのURI)を記述します。これはHTMLのような既知の(FPIだけでDTDの内容が明らかな)文書タイプの場合でも、公開識別子に続けてDTDを参照できるURIをシステム識別子として記述することができます。

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN"
  "http://www.w3.org/TR/html4/strict.dtd">

文書型宣言におけるシステム識別子の記述は、XMLでは必須になっています。XHTMLで仕様書に“厳密適合”することを目指す場合、あるいは&uuml;といったXHTMLで定義されている文字参照を利用したい場合は、システム識別子も含めた文書型宣言を記述しなければなりません(これらが不要ならば、文書型宣言を記述しなくても整形式XMLとして通用します。この場合は、名前空間を使って他の語彙を組み込むことが可能になります)。

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN"
  "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">

XHTMLでも文書タイプの名称はhtmlです。ただしこれが小文字になっていることに注意してください。

HTML5の場合

HTML5はDTDにもとづいていませんが、ブラウザが標準モードで(仕様に準拠した文書として)処理して良いことを示すためにDOCTYPEを用います。そのためFPIやシステム識別子は持ちいず、次のようなシンプルな形になっています。

(例)

<!DOCTYPE html>

一部のシステムでこれだと問題が生じる場合は、次のようなシステム識別子が用意されています。

(例)

<!DOCTYPE html SYSTEM "about:legacy-compat">

従来のHTML4/XHTML1用文書型宣言も認められていますが、HTML構文では推奨されていません。XHTML構文では文書型宣言の制約はありません。