ちょっとしたメモ

IE7、Firefox2でもRSS1.0にXSLTを適用させる

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と判定するのだという。

  1. <rdf:RDF
  2. http://www.w3.org/1999/02/22-rdf-syntax-ns#
  3. 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 [
 <!ENTITY host "http://purl.org">
 <!ENTITY rss1 "/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ファイルは見つかりませんでした」と試合放棄してしまうリーダーもあるので、完全とはいえないものの、現状では比較的有効な手段のように思われる。

関連メモ: