記事本文
XHTML 1.1 において、 text/html で Another HTML-lint による検証を行う
DOCTYPE 宣言において XHTML 1.1 を宣言していて、かつ meta 要素内で
<meta http-equiv="Content-Type" content="text/html; charset=EUC-JP" />
といった記述を行っている場合、 Another HTML-lint gateway ではエラーとして扱われます。
hxxk.jp は XHTML 1.0 Strict を宣言しており、更にこの辺りにあれこれ手を加えているので、このエラーは生じていません。 なので、ぱっと頭に思い浮かんだサイトを勝手に検証してエラーを再現させてもらいました。
http://mushline.com/junky/ を XHTML1.1 としてチェックしました。 14個のエラーがありました。このHTMLは 99点です。タグが 41種類 590組使われています。文字コードは UTF-8 のようです。
先頭の数字はエラーのおおまかな重要度を 0〜9 で示しています(減点数ではありません)。 少ない数字は軽く、9 になるほど致命的です。0 は減点対象外のごく軽度のエラーで (グレイのかっこつき) でメッセージされています。
Should not? Must not?
なぜこのようなエラーを出力するのか。 おそらく W3C Note の記述を根拠にしているのだと思われます。
Note that a meta http-equiv statement will not be recognized by XML processors, and authors SHOULD NOT include such a statement in an XHTML document served as 'application/xml' (and 'application/xhtml+xml' as well for that matter).
なお、XML プロセサは
meta http-equivによる指定を解釈しないこと、そのため制作者はapplication/xmlとして提供される XHTML 文書にそのような指定を記述すべきでないことも記しておく。 これはapplication/xhtml+xmlについても同様である。
この記述を元に、
1: line 5: <meta> に指定されているメディアタイプ text/html は XHTML1.1 には指定しないようにしましょう。 → 解説 143
というエラー項目を作成しているのだと私は想像しました。
これはあくまで Note であり、
This document is a Note made available by the World Wide Web Consortium (W3C) for your information.
Publication of this Note by W3C indicates no endorsement by W3C or the W3C Team, or any W3C Members.
と冒頭で書かれてあるとおり、参考情報に過ぎません。
( W3C勧告プロセスの概要 - W3C Notes / Working Group Notes )
そして、
記述すべきでない
という表現は Should not であり、してはならないということではないのです。
( XHTML Media Types - 2. Terms and Definitions )
XHTML Media Types - 3.5. Summary によると、
meta http-equiv による指定のみならず、 Media Type 自体についても XHTML 1.1 における text/html は Should not であると書かれています。
よって、減点対象のエラーとする必要はないのかもしれませんが、そこは作者である石野 恵一郎さんなりの判断基準があるのでしょう。
何故 text/html にこだわるのか
XHTML 1.1 において、 text/html が Should not で、 application/xhtml+xml が Should であるなら、 application/xhtml+xml を指定すればいいのです。 しかし、実際は text/html としているところがほとんどです。
依然ブラウザのシェアの大部分を占める IE が application/xhtml+xml に対応しておらず、 application/xhtml+xml が指定された XHTML 文書を表示できないということが理由として挙げられます。 実装に妥協して text/html を指定することの是非はここでは論じませんが、こういった現状のブラウザ事情への配慮の結果だと私は思います。
IE にのみ text/html を指定する
私は閑古鳥 -> 呟き -> Content-Typeを振り分けるいくつかの方法のコードをそのまま用いて、 application/xhtml+xml に対応している UA には application/xhtml+xml を、そうでない UA には text/html を送出するようにしています。
閑古鳥 -> 呟き -> Content-Typeを振り分けるいくつかの方法では目的に応じたコードがそれぞれ書かれてあり、また追記等もあってコード全体が書かれていないため、勝手にまとめたコードをここに記述しておきます。
<?php
$accept = $_SERVER['HTTP_ACCEPT'];
$ua = $_SERVER['HTTP_USER_AGENT'];
if (eregi("Opera", $UA)) {
header ("Content-Type: application/xhtml+xml; charset=EUC-JP");
} elseif (eregi("Another_HTML-lint", $_SERVER['HTTP_USER_AGENT'])) {
header ("Content-type: application/xhtml+xml; charset=EUC-JP");
} elseif (ereg("application/xhtml\+xml",$accept)) {
header ("Content-Type: application/xhtml+xml; charset=EUC-JP");
} else {
header ("Content-Type: text/html; charset=EUC-JP");
}
?>
これをそのまま PHP ファイルの先頭に記述するなり、このコードだけを別ファイルに保存して PHP ファイルの先頭にて include するなりすれば、 UA の対応状況に応じた HTTP ヘッダが送出されます。
Another HTML-lint と text/html と Movable Type にて Movable Type でのテンプレートへのコード記述方法を書きました。 Movable Type ユーザーの方は合わせてお読みください。
Another HTML-lint の小技
Another HTML-lint : How to use htmllint.cgi - 問い合わせ変数一覧に書いてありますが、 HTTP ヘッダがどのように送られているかを調べることができます。 HTTPHeader という変数に on を代入すればいいのです。
たとえば、 hxxk.jp のトップページの検証を行い、かつソースの表示および HTTP ヘッダの表示を行いたい場合、
http://openlab.ring.gr.jp/k16/htmllint/htmllint.cgi?URL=http://hxxk.jp/;ViewSource=on;HTTPHeader=on
という URI をリクエストすると、前述の条件で検証結果を返してくれます。
Another HTML-lint gateway にて、
URL指定のときHTTPレスポンスヘッダを表示します。
にチェックを入れても同様のことが行えますが、上記の方法は検証結果に直接リンクできるので、記事などの中で用いるときに便利かもしれません。

