お使いのブラウザは最新版ではありません。最新のブラウザでご覧ください。

CNET Japan ブログ

<DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">は実は間違っている?

2009/04/17 01:34
  • このエントリーをはてなブックマークに追加

ミキ・オキタWebClip ウェブデザインのニュース

この記事のトピック

こんにちは。“時代の3歩先をねらうWeb屋さん”ミキ・オキタです。
このブログ「WebClip ウェブデザインのニュース」では、Webデザイン・Webマーケティングの話題をお届けしています。

今回は、Web標準に沿った HTML 4.01 のコーディングに関するテーマ。
HTMLに慣れている方向けの内容です。

“http://www.w3.org/TR/html4/loose.dtd”は省略してはいけない。

HTML文書の冒頭には、!DOCTYPE宣言を置くことになっている。
例えば、HTML 4.01 Transitional であれば、次のように記述する。

[パターンA: 標準の!DOCTYPE宣言]
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"
"http://www.w3.org/TR/html4/loose.dtd">

!DOCTYPE宣言について、いくつかのHTML解説サイトで「後半部の“http://www.w3.org/TR/html4/loose.dtd”は省略してもよい」と説明されている。省略する場合、!DOCTYPE宣言は次のように記述する。

[パターンB: 後半部を省略した場合]
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">

主要なブラウザ(Internet Explorer、Firefox、Safari、Opera)は、[パターンA]と[パターンB]で、HTMLのレンダリングモードに違いが生じる。[パターンA]の場合はレンダリングモードが「標準準拠モード」となり、[パターンB]では「後方互換モード」となる。

だが、そもそも「“http://www.w3.org/TR/html4/loose.dtd”は省略してもよい」のであれば、なぜ主要なブラウザは[パターンB]を「標準準拠モード」でレンダリングしないのだろうか?
「省略してもよい」の根拠はどこから来ているのだろうか?

いろいろ調べてみた。
結論から言うと“http://www.w3.org/TR/html4/loose.dtd”は、現時点においては、『省略してもよいとは言い難い』ようである。

「省略してよい」の根拠はどこから来たのか。

!DOCTYPE宣言において“-//W3C//DTD HTML 4.01 Transitional//EN”部分を“公開識別子”と呼び、“http://www.w3.org/TR/html4/loose.dtd”部分を“システム識別子”と呼ぶ。

“公開識別子”と“システム識別子”

「システム識別子“http://www.w3.org/TR/html4/loose.dtd”は省略してもよい」という根拠はどこから来たのだろうか?

W3Cの HTML 4.01 仕様書に「省略してよい」という記述はない。
!DOCTYPE宣言の該当箇所を以下に抜粋して引用する。

7 HTML文書の全体構造 - HTML 4.01仕様書
http://www.asahi-net.or.jp/~SD5A-UCD/rec-html401j/struct/global.html#h-7.2

7.2 HTMLバージョン情報
適正HTML文書には、どのバージョンのHTMLであるかの宣言がある。 文書型宣言が、当該文書の文書型定義(DTD)の名前を示す ( [ISO8879]参照)。

HTML 4.01仕様は、3つのDTDを規定しており、著者は自分の文書に、次の3つの何れかの文書型宣言を含めねばならない。各DTDは、サポートする要素が異なってる。

HTML 4.01厳密型DTD。これは、推奨しないこととなった要素や属性を含まず、またフレーム設定用の要素・属性をも含まない。このDTDを用いる文書は、次の文書型宣言をせよ。
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN"
"http://www.w3.org/TR/html4/strict.dtd">

HTML 4.01移行型DTD。これは、厳密型DTDのすべての要素・属性に加えて、推奨しない要素や属性も含む(推奨しないもののほとんどは視覚的プレゼンテーションに関わるものである)。このDTDを用いる文書は、次の文書型宣言をせよ。
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"
"http://www.w3.org/TR/html4/loose.dtd">

HTML 4.01 フレーム設定型DTD。これは、移行型DTDのすべてに加えて、フレーム用の内容を加えたものである。このDTDを用いる文書は、次の文書型宣言をせよ。
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Frameset//EN"
"http://www.w3.org/TR/html4/frameset.dtd">

(中略)

公開識別子とファイルの結びつきは、Oasis Open Consortium ( [OASISOPEN]参照)の推奨に従ったカタログファイルを用いて指定できる。 HTML 4.01のサンプルカタログファイルは、HTMLのためのSGML参照情報を記した節の冒頭に含まれている。

HTML 4.01 仕様書では「次の3つの何れかの文書型宣言を含めねばならない」とある。示された例は、システム識別子“http://www.w3.org/TR/html4/loose.dtd”まできちんと記述されている。「省略してもよい」ということは読み取れない。

ポイントになるのは、冒頭の「 [ISO8879]参照」と書かれた部分。[ISO8879]はHTMLの母体となったSGMLの仕様書だ。原文は英語だが、和訳版が[JIS X 4151]として存在する。

この中に、「省略してよい」の根拠となったと思われる一文が存在する。
以下に抜粋して引用する。

9.1.6 外部識別子 - JIS X 4151-1992 文書記述言語SGML
http://www1.u-netsurf.ne.jp/~7l1rll/SGMLsec9_0.html#ex73

システム識別子は,公開識別子及びその他の情報からシステムが補充できるのであれば,省略してもよい。

システム識別子は、公開識別子からシステムが補充できるのであれば、省略してもよい。
つまり、システム識別子“http://www.w3.org/TR/html4/loose.dtd”は、公開識別子“-//W3C//DTD HTML 4.01 Transitional//EN”から、HTML 4.01 Transitionalであることが自明であるので「省略できる」という解釈だ。

一見、この解釈は正しい。
世間で流通している「省略できる」という話も、これを根拠にしていると思う。

「省略してよい」条件を各主要ブラウザは満たせない。

ここからがポイントだ。
先ほどの一文を、もう一度読み解いてみよう。

システム識別子は,公開識別子及びその他の情報からシステムが補充できるのであれば,省略してもよい。

「補充」は「システム」が行う。「システム」は“一般のWebサイトであれば”Internet ExplorerやFirefoxなどの「ブラウザ」となる。つまり、

公開識別子“-//W3C//DTD HTML 4.01 Transitional//EN”から、ブラウザが自動的に、システム識別子"http://www.w3.org/TR/html4/loose.dtd"を「補充」する機能を持っていれば「省略してもよい」

という意味になる。

ここで思い出してみよう。
主要なブラウザは、システム識別子“http://www.w3.org/TR/html4/loose.dtd”を省略したとき、どのような挙動を示したか。
どのブラウザも、文書を HTML 4.01 Transitional とは認識しなかった。「後方互換モード」でレンダリングした。公開識別子から、適切なHTMLバージョンを判断していない。

現実問題として、主要なブラウザは、公開識別子“-//W3C//DTD HTML 4.01 Transitional//EN”から、システム識別子“http://www.w3.org/TR/html4/loose.dtd”を「補充」する機能を持っていない(あるいはそのような挙動を示さないように作られている)のだ。
先ほどの仕様書に立ち返って考えると、

システム識別子は,公開識別子及びその他の情報からシステムが補充できるのであれば,

というケースに該当しない。むしろ「補充できない」ので「省略してはいけない」が結論になる。
(もちろん、そのHTML文書の想定利用環境に主要なブラウザが一切含まれない場合は、これに限らない。あるいは、将来、主要なブラウザに上記機能が搭載されれば話は変わる。実際、W3C HTML Validation Service は想定ブラウザという概念がなく、文法チェックだけするため、省略されていても適合判定となる)

したがって、

[パターンB: 後半部を省略した場合]
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">

は、避けたほうがよい。
[パターンA]で記述すべきだ。

[パターンA: 標準の!DOCTYPE宣言]
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"
"http://www.w3.org/TR/html4/loose.dtd">

ちなみに、XHTML 1.0 では、システム識別子は必須とされている。

【謝辞】
SGMLについてkunishiさんに丁寧にアドバイスいただきました。ありがとうございました。

この記事に拍手する

はてなブックマークに追加はてなブックマークに追加

※このエントリは CNET Japan ブロガーにより投稿されたものです。朝日インタラクティブ および CNET Japan 編集部の見解・意向を示すものではありません。
運営事務局に問題を報告

最新ブログエントリー