XHTML Media TypesがW3C Noteとして発行されて5年以上になるというのに、XHTML 1.0文書をずっとtext/html
として提供してきたわけだが、このほどAcceptヘッダにapplication/xhtml+xmlが含まれる場合はこのMIMEタイプでリソースを送る設定に変更した。最近のいろいろな試行を通じて、この必要性がかなりはっきり見えてきたからだ。
application/xhtml+xmlその理由
文書が整形式XMLになっていさえすれば、メディアタイプに関係なくXSLTなどのツールは利用できる。それに加えて、IE問題回避のために小細工する必然性が見出せなかったこともあり、このサイトではtext/html
を使い続けてきた(その代わり整形式の重要性を一所懸命、訴えていた)。ここにきてそれが翻ったのは、この2~3ヶ月ほど繰り返していたLinked Dataの試行を通して、XMLメディアタイプの指定が有益であり、また必要だと思うようになったからだ(この試行については、また別途)。
Linked Dataの実現に大きな役割を担うものとして、XHTML文書からRDFを抽出するGRDDLがある。これは、自分で試しているうちはよいのだが、Linked DataとしてRDFエージェントが次の文書をたどろうとすると、問題にぶつかってしまう。
- その文書はGRDDLによるRDF抽出を試みることができる(XHTML文書である)のか
- XHTML文書型を採用しているとして、きちんと整形式になっているのか
1点目は、メディアタイプがapplication/xhtml+xml
ならすぐさまGRDDL処理を試みてもよいが、text/html
のときは文書を開いてみないと分からないという問題。text/html
文書をまず読み込んで、XML宣言や文書型宣言、あるいは名前空間宣言によってXHTMLかどうかを判断したり、HTMLならばTidyなどでXHTMLに変換してからGRDDLの処理を試したりすることになる。せっかくXHTMLとして文書を提供しているのに、こうした余計な手間をかけさせるのは無駄な話だ。
2点目は、提供者はXHTMLのつもりなのにミスで整形式でなくなっている場合で、現実にはこれが非常に多い。application/xhtml+xml
にすると、整形式でなければブラウザでも表示してもらえないから、必然的に正しいXHTMLを意識するようになる。提供者自身のためにも、メディアタイプをXMLにする方がメリットがあるということなのだ(これは、自分でメディアタイプを変えてみて、不注意によるエラーがけっこうあるのに呆れて再認識した)。
メディアタイプ変更メモ
メディアタイプがapplication/xhtml+xml
になると、対応ブラウザは文書をXMLベースで解釈するが、そのさじ加減が微妙に異なることもあり、text/html
と同様の表現を確保するためにはいくつかの作業が必要になる。すでに2003年ごろに議論され尽くしたような話ではあるが、今回やったことのいくつかをメモしておこう。
ブラウザによるメディアタイプの使い分けは、Apacheならmod_rewriteを使うことが多い。次のような設定を
httpd.conf
や.htaccess
に加える(デフォルトがtext/html
の場合)。(例)
RewriteEngine on RewriteCond %{HTTP_ACCEPT} application/xhtml\+xml RewriteCond %{LA-F:REQUEST_FILENAME} \.html$ RewriteRule .* - [L,T=application/xhtml+xml;charset=Shift_JIS]
2番目のRewriteCondの
LA-F:
は、MultiViewsで拡張子なしのURIでのアクセスを使っているときでもこのrewriteを行うためのもの。ただし、httpd.confファイル内での記述位置によって機能しなかったり副作用が出たりするようなので、注意が必要だ。charset
はもちろん文書の文字コードに合わせる。動的なページについては、
HTTP_ACCEPT
をチェックしてヘッダを使い分けるだけだから簡単。HTML DOMのHTMLDocumentインターフェイスで定義されている属性やメソッドがスクリプトで使えなくなる。特に
document.write
が不可なのが大きい。innerHTML(非標準だけれどもHTML5の拡張候補で、現在どのブラウザでもHTML/XHTML共通に使える)でいくか、このサイトのスクリプトのように、DOMParserが使える(≒application/xhtml+xml
対応)ブラウザの場合だけdocument.write
自身をDOM Core対応版で書き換えてしまう。getElementsByTagName
はDOM CoreのDocumentインターフェイスで定義されているのでそのままでよいが、引数のタグ名を大文字にしていると要素が見つからなくなるから、小文字に置き換える。厳密には
createElement
で作ったノードはXHTMLの要素としての操作ができなくなる(Safariがそうなる)ので、createElementNS
に置き換える(ただしIEでは使えないので、やはりDOMParser対応の場合のみ)。
そのほか、CSSでのbodyとhtmlの解釈の仕方が変わるなど、メディアタイプ変更の影響は小さくない。それでも、やはり、こうなったらapplication/xhtml+xml
で行くのだ。
- HTML4の10周年 (2007-12-18)