草稿です。今後内容は大幅に変わる可能性があります。
HTMLといっても、若干異なる文法を持った複数のタイプがあります。これを文書型と呼び、一般的には:
をHTML文書の先頭に記述することでそれを示します(XHTML文書ではあるいはXML宣言の次)。例えばHTML 4.01 strictでは、文書の先頭に次のような文書型宣言を記述します。
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN" "http://www.w3.org/TR/html4/strict.dtd">
建前としては、User Agent(ブラウザ等のこと)がそのHTML文書がどのバージョンのHTMLに従って書かれているのかを判別する為です。しかしそのような「判別」を行うUser Agentが少ないためか、多くの一般製作者はこれを記述しません。
しかし皆がやっていなかろうと、私は絶対に文書型宣言を記述します。何故ならこれを記述しない場合、そのHTML文書を「適当な文法で解釈してくれて構わない」と宣言するようなものだからです。そんないい加減なことでは困ります。
現状ではHTMLを独自の文法に基づいて解釈してしまうブラウザが多いわけですが、本来なら、文書型宣言のないHTML文書を解析することは不可能です。何故なら、例えばどのタグが省略可能なのかをHTMLブラウザは知ることが出来ないからです。
<link rel="stylesheet" href="style/style.css">
このようなlink要素があったとして、このlink要素の終了タグが省略可能であることを知らなければ、以下登場する全ての要素はlink要素の子供として解釈されてしまうかもしれません。
確かにそのような酷い解釈をするブラウザは私は知りません。しかし考えてみてください。ブラウザが独自の勝手な文法でHTML文書を解釈するということは、HTMLの自由な発展が阻害されていることを意味します。極めて不自由な世界です。
「HTMLはもう腐ってしまったフォーマットだ」、と言う方もいます。しかしHTMLを「腐らせて」しまったのは、勝手な文法で解釈するブラウザと、それに甘え、依存してしまったHTML文書の製作者達なのです。ちなみにHTMLは今後の発展が無いというだけで、別に腐ってなんかいません。XML関連規格で一儲けしようという方々が既成事実としてでっち上げようとしているだけです。
XMLですが、まあHTML文書も碌に書かなかった(「腐らせて」しまった)人達が、HTMLを捨ててXMLに移行したところで、また同じ事の繰り返しでしょう。XMLはHTML程鷹揚にはできていません(文法がシンプルであるということは、鷹揚ではないことを意味します)。HTMLの時代のように「楽をしたい」人達は、文法の依存度の低い独自のXMLパーサーを開発するでしょう(実際にRSS方面でこの動きを見ました)。そして歴史は繰り返すわけです。
HTMLやXMLといった規格を腐らせる一役を担うつもりが無いのであれば、文書型宣言を行ってください。「文書型宣言なんて信者の自己満足だ」などと言う人達は短期的な視点しか持つことの出来ない盲目の羊です。無視してください。
野崎さんの書かれた文書型宣言に就いてでは、その他の理由が述べられています。是非参考にしてください。
文書型宣言を記述する実質的な利点も存在します。それが文法チェックです。文書型宣言をすることによって、文法チェッカはその文書が従っている文法を知ることが出来ます。
とても便利な検証方法を紹介します。
この文法チェッカは、複数のHTML文書を一括してチェックしてくれます。そのサイト内の文書のリンク集、つまりHTML形式のサイトマップを用意してWWWサーバに公開し、この文法チェッカにかけると、そのサイト内の全てのHTML文書をチェックしてくれます。100個までの制限つきです。
製作者は、適切な文書型を選択する為に色々な文書型の性質について知らなければなりません。しかしそれはあまりにも大変ですので、私なりに各文書型の特徴と、どういった製作者が使うべきなのかを纏めてみましたので、宜しければ参考にしてください。
2003年2月現在HTMLは大きく分けて、SGML応用であるHTMLと、SGML応用でありかつXML応用でもあるHTML(XHTML)に分かれます。まずこの違いを知っておくべきです。
HTMLとXHTMLのどちらを選択するかを決めたなら、次に各バージョンを選択できます。
HTMLを選択した方は次の中から文書型を選ぶことが出来ます。
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN"
"http://www.w3.org/TR/html4/strict.dtd">
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"
"http://www.w3.org/TR/html4/loose.dtd">
<!DOCTYPE HTML PUBLIC "ISO/IEC 15445:2000//DTD HTML//EN">
HTML 4.01 framesetは、FRAMESET要素でフレームを定義する際に必ず使用する文書型です。FRAMESET要素の登場しない文書ではこの文書型を宣言してはいけません。
また、FRAMESET要素はたとえプロフェッショナルであっても9割方は屑のような使い方しかできていません。この文書型を利用するのは、まず、まず止めておいた方が良いでしょう。使いこなすのは極めて難しく、大抵使い勝手の悪いへんてこりんな「ほーむぺーじ」を後押しする原因となります。しかし、自信のある方はやってみましょう。
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Frameset//EN"
"http://www.w3.org/TR/html4/frameset.dtd">
XHTMLを選択した方は、次の中から文書型を選ぶことが出来ます。
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN"
"http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.1//EN"
"http://www.w3.org/TR/xhtml11/DTD/xhtml11.dtd">
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML Basic 1.0//EN"
"http://www.w3.org/TR/xhtml-basic/xhtml-basic10.dtd">
<!DOCTYPE html PUBLIC "+//IDN purl.org/net/lena//DTD XHTML Primary 1.0//EN"
"http://purl.org/net/lena/xhtml-lena10.dtd">
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 2.0//EN"
"http://www.w3.org/TR/xhtml2/DTD/xhtml2.dtd">
XHTML 1.0 framesetは、frameset要素でフレームを定義する際に必ず使用する文書型です。frameset要素の登場しない文書ではこの文書型を宣言してはいけません。
また、frameset要素はたとえプロフェッショナルであっても9割方は屑のような使い方しかできていません。この文書型を利用するのはまず、まず止めておいた方が良いでしょう。使いこなすのは極めて難しいのです。
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Frameset//EN"
"http://www.w3.org/TR/xhtml1/DTD/xhtml1-frameset.dtd">
XMLは独自の「タグ」を定義できると思っている人が沢山います。しかし、XHTMLで「独自のタグ」もとい「独自の要素型」を定義することは出来ません。そのようなことをした時点でXHTML文書では無くなります。パース不能にならないというだけです。XHTMLに対応したブラウザは、製作者が独自に定義した要素型を「不明な要素型」としてしか解釈しません。
名前空間を使おうと同じ事です。ある名前空間を使った場合、XHTML対応ブラウザは、その名前空間を知っていなければなりません。例えばMathMLの名前空間を使ってXHTML文書にMathMLを組み込む場合、ブラウザはMathMLも実装している必要があります。その可能性はあるでしょう。しかし、個人製作者が独自に作った名前空間を、XHTMLブラウザは知り得ません。
一つ例を挙げます。
<div class="section" />
<ns:section />
製作者にとって「セクション」を意味するであろうこれらの要素は、XHTMLブラウザにとってはセクションではありません。しかし、ブロック要素であることを伝えることが出来るという意味で、div要素型を使った前者の方が「マシ」です(ユーザースタイルシートを利用することを考えてみてください)。ns:section要素は、ブロックであるかインラインであるかさえ分からない、全く不明な要素に過ぎません。
「XHTMLでは要素を自由に拡張できる」というのはとんでもない嘘っぱちですので、十分に気をつけてください。もし勝手に名前空間を使って要素型を拡張するのが是とされたならば、Netscape社による独自拡張に端を発した悪しきHTML時代の二の舞になるかも知れません。これ(ユーザー固有の名前空間)が効力を発揮するのは、事前の取り決めに基づいたローカルなネットワークにおいてです。もしくは、特殊なメディア向けの規格としてXHTML Basicを元に拡張要素型が定義されることは有り得ます。その拡張要素を解釈できるUser Agentの存在があるからです。
色々と書きましたが、実は私は名前空間による拡張を利用しています。ただしそれはローカルで使用する為のものであり、そのままXHTML文書として公開することはしません。
つまり、XHTMLという文書型を使うからといって、何か高度な拡張を行わないと意味が無いと考えるのは大きな間違いです。XHTMLの文法はHTMLよりもシンプルなものであり、そのシンプルな文法にのっとって形式的に文書をマークアップすればそれで立派なXHTML文書です。
そしてその「立派なXHTML文書」は、XMLパーサで解析することが可能であり、さまざまな関連規格を利用して比較的簡単に再利用することが可能です。例えばXHTML 1.0 strictの文書型に従って記述していたものを、XHTML 2.0 の文書型に従ったものに変換することなどは極めて容易です。