XHTMLのXML宣言省略問題

2010.10.28crossnodeHTML


W3C勧告でXHTML文章に記述する事が強く推奨されているXML宣言ですが、これを記述するとIE6では互換モードとして独自の解釈をされて他のブラウザと表示結果がずれてしまう場合があります。
これはDOCTYPE宣言を1行目に書かないと互換モードとして処理されるというIE6のバグのために起こる症状です。

XML宣言

<?xml version="1.0" encoding="UTF-8"?>

そもそもこのXML宣言というものは、その文書がXML文書であることを明確に示すもので、XHTMLはXML形式の文書ですから当然宣言する必要があります。
しかし、この宣言を省略すればDOCTYPE宣言が1行目になり、IE6でも他のブラウザと同じように標準モードで表示されます。

「W3C勧告で強く推奨されているのに省略しちゃっていいの?」と思うかもしれませんが、文書のキャラクタエンコーディング(文字コード)がUTF-8かUTF-16の場合には省略することが許されているのです。

「だったら省略すればいいじゃない」と言いたくなるのですが、そうもいかないジレンマがあるのでした。

文法チェックの権威「Another HTML-lint gateway」では、XML宣言を省略しているとUTF-8で書いても大きく減点されてしまうのです。
下記はW3Cチェックをパスしてlintでもエラーが1つも出ないソースです。

W3C準拠テンプレート

<?xml version="1.0" encoding="utf-8"?>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="ja" lang="ja">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
<meta http-equiv="Content-Script-Type" content="text/javascript" />
<meta http-equiv="Content-Style-Type" content="text/css" />
<title>Hello world!</title>
<link rev="made" href="mailto:sample@sample.com" />
<link rel="index" href="index.html" />
<link rel="next" href="next.html" />
<link rel="prev" href="prev.html" />
</head>
<body>
<p>Hello world!</p>
</body>
</html>

lintでチェックした結果は下の画像のとおりです。
100点満点でエラーが1つも無く「たいへんよくできました」という評価のついたソースも、1行目のXML宣言を省略しただけで85点になってしまいました。
W3Cではどちらもチェックをパスできるのに、lintではXML宣言の省略をかなり重大なエラーとみなされてしまうのです。

XML宣言を省略しない場合

XML宣言を省略してDOCTYPE宣言から始まっている場合

W3C勧告というのは、(X)HTMLという言語はそれを実行するブラウザによって表示結果が違ったり、ブラウザによっては解釈できないプロパティがあったりするので、さまざまなユーザーが等しく情報を得られるように標準規格を定めましょう。ということでW3C(World Wide Web Consortium)という国際的な標準化団体が策定しているものです。
したがって、W3C勧告に準拠することによって、ブラウザ互換性も良くなりますし、書く人が違っても文法が同じなのでソースが追いやすくメンテナンス性も向上します。

また、勧告はバージョンアップを重ねて、マークアップ(文書構造)とスタイルシート(視覚表現)の分離についても厳密化されてきました。(X)HTMLはよりシンプルなテキスト構造を表すようになったので、検索しやすくなりSEO的にも有利とも言われています。

国際的な標準規格ですしメリットも多いですから、コーディングの際にW3Cチェックは欠かせませんよね。

一方、Another HTML-lint gatewayは、石野恵一郎氏が作成した文法チェックソフトウェアで、文法チェックだけでなくアクセシビリティへの配慮についても判定して、その重要度に応じて100満点から減点法で採点されます。
アクセシビリティについても判定されるので、W3Cのチェックをパスしているのにlintで満点ではないという場合もあります。(例:divやspanの中身が空の場合W3Cチェックは通りますが、lintでは減点されます。)

あくまでも個人の方が制作したプログラムによる判定であり、文法の正確性や要素の重要度などを保証してくれるというサービスではないので、絶対100点をとらないければいけないということはありません。
ですが、制作物を多角的に評価することは良い事ですから、W3Cチェックとほぼセットでlintのチェックもする人が多いことでしょう。何でも満点をとるのは気持ちいいですしね。

ということは、国際規格のW3Cでは許されているのだからlintは気にせず、やっぱりXML宣言は省略すればいいんじゃないの?と思うかもしれませんが、lintの人気は高く、お客様のなかにもlintを知っていて、採点結果を気にするという方も多いようなのです。

そこで、W3Cでは許されているのだからXML宣言を省略するか、lintで満点をとるために宣言を記述するかでジレンマが生じて、たびたび話題に挙って未だに論じられています。

省略せずにIE6の表示を正常化するには、W3Cチェックでエラーが出ないやりかたでIE6をハックして調整しなければなりません。
サイトの規模や実装内容によっては、デバッグ作業がヘビーになるケースもあるので、場合によってはXML宣言を省略することもあるという人も結構いるようです。

この問題は長らく議論の的となりながら誰もが納得する結論というものは出ていません。なにを優先するかという判断基準は制作者もお客様も人によって千差万別ですので一言で何が正解とは言えないということですね。

コメントを残す


ページトップへ