Jintrick.netagenda2002年07月アーカイブ → 2002年07月11日

XMLにユーザースタイルシート適用

ProxomitronのHeadersフィルタ(IN)で、text/xmlをtext/htmlにすげかえてみたところ、なんか知らんがWinIE(6.0)はXMLとして表示してくれる。

IEのこの奇妙な解釈は興味深い。text/htmlでもxml宣言を見ている? じゃあXHTMLはなぜHTMLとして表示されるのか。なにを見てHTMLだと判断するのか……。

ともかく、XMLにユーザースタイルシート(ユーザーXSL?)を使える。RSSな更新情報を一貫したHTMLに変換すれば、埋め込みJavaScriptによるDOM操作で自分寄りのユーザビリティも追求できる、という寸法。どのサイトもThe Web KanzakiのようなXSLを使ってくれていればいいのだけど、大抵のニュースサイトだのその辺りは、RSSを人向けに提供していない。でも私としては、「不思議マークアップされたHTML + 広告 + 段組」のゴタゴタした「ぺーじ」を見るより、RSSを自分のスタイルシートで閲覧したい。90%はさらっと読み流すだけだし。

ところが IEのこの奇妙な解釈を調べてみると、HTMLとして扱うか、XMLとして扱うか、その判断基準が極めて曖昧だった。まあRSSなら確実にXMLとして扱ってくれるみたいだから良いのだけど。好奇心が。

WinIE6はXML宣言つき文書をどう扱うか

一行目にXML宣言が記述されており、かつContent-Type:text/htmlで送られてくる場合、HTMLとして表示するかXMLとして表示するかを判別するIE6の基準みたいなものを調べてみた。

文書の内容を変更してリロードするという方法を使うと、直前に表示した方法が反映されてしまうので、異なる複数の文書を用意して、ともかく色々と試した結果、どうも色々な部分を見ているとしか結論できない。

title要素があるかないかで判別されるケース

例えば、title要素があるかないかで判別されるケースを例示する。

test20020709.html
<?xml version="1.0" encoding="Shift_JIS"?>
<root>
<h1>test</h1>
</root>

title要素無しの文書はXMLとしてツリー表示された。xml宣言をみているらしい。

test20020709_with_title.html
<?xml version="1.0" encoding="Shift_JIS"?>
<root>
<title>test</title>
<h1>test</h1>
</root>

一方、title要素アリの文書はHTMLとしてデフォルトスタイルシートが適用された。

ルート要素がhtmlかどうかで判別されるケース

test20020709_with_html.html
<?xml version="1.0" encoding="Shift_JIS"?>
<html>
<h1>test</h1>
</html>

また、title要素がなくとも、ルート要素がhtmlであった場合、HTML文書として表示されるようだ(XML宣言は無視される)。

というか、別にルート要素じゃなくても、html要素があればHTML文書ということになるらしい。

test20020709_with_html2.html
<?xml version="1.0" encoding="Shift_JIS"?>
<root>
<html>
<h1>test</h1>
</html>
</root>

body要素があるかどうかで判別される場合

test20020709_with_body.html
<?xml version="1.0" encoding="Shift_JIS"?>
<root>
<body>
<h1>test</h1>
</body>
</root>

body要素があるとHTML。h1要素との組み合わせとかも影響していたりして。

まとめ?

IE6は、リソースが「Content-Type:text/html」で送られてきたとしても、xml宣言がある場合には基本的にXML文書として扱うが、title要素があったり、html要素があったり、body要素があったり、ともかく何となくHTMLッぽいと、HTML文書として扱う(なんだ、そりゃ)。

しかし、例えtitle要素があったとしても、XMLとして扱われることもある。例えばコレ。 http://www.w3.org/2000/08/w3c-synd/home.rss (英語)。この文書にはtitle要素が存在するが、ProxomitronでContent-Type:application/xmltext/htmlに改竄してgetしても、XMLとして扱われる。そういうわけで、ともかく色々な判別基準があるようだ。単純なルールに基づいているのだろうという予測は、甘かった。

ファジーなUser Agent、Ineternet Explorer6。

つっこみ

If the server-provided MIME type is either known or ambiguous, the buffer is scanned in an attempt to verify or obtain a MIME type from the actual content. If a positive match is found (one of the hard-coded tests succeeded), this MIME type is immediately returned as the final determination, overriding the server-provided MIME type (this type of behavior is necessary to identify a .gif file being sent as text/html). During scanning, it is determined if the buffer is predominantly text or binary.

Appendix A: MIME Type Detection in Internet Explorer より

どこら辺がpositiveだよ。

注意点

一度でもHTMLとして表示してしまった文書は、改めてContent-Type:text/xml などで送りなおしても、頑なにHTMLとして表示する。正しく表示させるには再起動などが必要。逆も同様。一度でもXMLとして表示してしまった文書は、ValidなXHTML文書に直したとしても頑なにXMLとして表示する。再起動などが必要。

実はあった?ベターな方法

ProxomitronのWebPageフィルタを、text/xml、application/xmlなMIME typeのリソースにも適用させる手段が見つかった。$FILTER(true)というコマンド。

このコマンドを使えばいけそうなことは分かるのだけど、使い方が分からないよ。

In = TRUE
Out = FALSE
Key = "Content-Type:Filter text/xml"
Match = "(text/xml*)\0"
Replace = "\0$FILTER(true)"

一応マッチしていることは分かるのだけど、$FILTER(true)というのが効いていない。バージョンは新しいものだし、ぐったり。


webmaster@jintrick.net
公開: 2002年07月11日
カテゴリ: ブラウジング