IE7やFirefox2は、「フィード」をMIMEタイプで判別できないときは、コンテンツの先頭部分のテキストマッチで判断して「フィードプレビュー」を起動しているらしい。判定用の文字列パターンをRSSファイルで直接用いないようにしたら、確かにどちらのブラウザもプレビューではなくてXSLTを適用するようになった。ただし、一般のフィードリーダーの中にも同じような文字列マッチを使っているものがある模様で、方法によってはこれらのフィードリーダーでも修正版RSSを読めなくなってしまうので注意が必要だ。
Microsoft Team RSS BlogのWindows RSS Publisher's Guideによれば、MIMEタイプがapplication/xml
もしくはtext/xml
であるときは、IE7はコンテンツ冒頭の512バイトを読んで、その中に次の3つの文字列があればRSS1.0と判定するのだという。
<rdf:RDF
http://www.w3.org/1999/02/22-rdf-syntax-ns#
http://purl.org/rss/1.0/
最初のrdf:RDF
は接頭辞の問題だから任意に変更できる。試しにRDF名前空間URIの接頭辞をr:
(つまり1.を<r:RDF
)にしてみたら、あっさりとXSLTが適用できた。Firefox2.0でも同様の判定方法をとっているらしく、この接頭辞でどちらのブラウザもうまくいく。2番目と3番目はRDFとRSS1.0の名前空間URIなので直接手を加えるわけには行かないが、実体参照を使って文字列を分割することはできるから、これらも同様に利用可能だ。
対応法としては接頭辞rdf:
を変更するのが簡単そうだが、いくつか試してみると、一般のRSSリーダーの中にもrdf:RDF
を使ってRSS1.0を判定方法を用いているらしきものが結構あることが分かった。結果として、接頭辞置き換えによる修正版RSSは多くのフィードリーダー(オンライン、オフラインともに)で読めなくなってしまい、少々具合が悪い。
興味深いことに、実体参照を使った方法は、IE7、Firefox2では一般のXML扱い(XSLTが適用される)でありつつ、大部分のフィードリーダーできちんと読める。これは、例えば次のような具合に記述すればよい。
(例)
<?xml-stylesheet href="your xlst" type="text/xsl"?> <!DOCTYPE rdf:RDF [ <!ENTITYhost
"http://purl.org"> <!ENTITYrss1
"/rss/1.0/"> ]> <rdf:RDF xmlns:rss="&host;
&rss1;
" xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#" ...
(ここで、<!ENTITY rss "http://purl.org/rss/1.0/">
のような実体宣言をしても、URIの文字列がそのまま記述されているので、テキストマッチ回避には役立たないことに注意)
RSSにXSLTを適用させるには、(MIMEタイプをapplicatoin/rss+xml
以外にした上で)先頭512バイトをコメントにするとか、文字コードをUTF16にするといった方法もあるようだが、これらはやはり多くのRSSリーダーでも読めなくしてしまう模様。実体参照法も、たとえばYahooのように「RSSファイルは見つかりませんでした」と試合放棄してしまうリーダーもあるので、完全とはいえないものの、現状では比較的有効な手段のように思われる。
- IE7もFirefox2もRSSを特別扱い (2006-10-26)