ちょっとしたメモ

今どきのXHTMLメディアタイプ

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対応版で書き換えてしまう。

  • getElementsByTagNameDOM CoreのDocumentインターフェイスで定義されているのでそのままでよいが、引数のタグ名を大文字にしていると要素が見つからなくなるから、小文字に置き換える。

  • 厳密にはcreateElementで作ったノードはXHTMLの要素としての操作ができなくなる(Safariがそうなる)ので、createElementNSに置き換える(ただしIEでは使えないので、やはりDOMParser対応の場合のみ)

そのほか、CSSでのbodyとhtmlの解釈の仕方が変わるなど、メディアタイプ変更の影響は小さくない。それでも、やはり、こうなったらapplication/xhtml+xmlで行くのだ。

関連メモ:
map - genre: xhtml. at