RSS 1.0におけるrdf:aboutとかlinkにまつわるあれこれ
久々にお勉強エントリ。
きっかけは、SiReFaSoをValidation Checkにかけてみて引っ掛かってしまったため。HTML5の文法チェックのつもりで、HTML自体はValidだったのだけれども、RSSがInvalidと判定されてしまった。(CSSもInvalidなのだけれども、モダンブラウザのCSS3先行実装などを利用しているためそこは諦めている。早く仕様が固まってprefix取れるといいな。)
引っ掛かったのはRSS 1.0。item要素のrdf:aboutの属性値が他のitem要素のものと被ってる、とのこと(rdf:aboutはユニークでないといけない)。以下はこのblogのRSSの一部。個別記事にはユニークなURLが割り当てられている。
<item rdf:about="http://home.384.jp/evidence/cgi-bin/archives/84.html">
<title>SiReFaSo更新</title>
<link>http://home.384.jp/evidence/cgi-bin/archives/84.html</link>
<description>SiReFaSo更新
今までNTCのデータをコピーしてるだけでしたが、NTCのデータが飛んだ時に共倒れとなってしまうので、単独で巡回・更新捕捉出来るようにしました。
SiReFaSo - 伺かゴースト更新フィード
新規登録ゴーストを @sirefa...</description>
<dc:date>2010-06-13T17:38:00+09:00</dc:date>
</item>
SiReFaSoは他にRSS 2.0とAtom 1.0を出力しているがそちらはValid。この2つは既存のPythonのライブラリを使っているので仕様をあまり知らないまま出力してるけれども変なことにはなっていない。問題はRSS 1.0で、これを出力するPythonのライブラリをかなり頑張って探したのだけれども見つからなくて、自分でテンプレートを書いて出力している。元になっているのはNTCのRSS 1.0(こちらはPHPのライブラリを使って出力している)。
本当はSiReFaSoではRSS 1.0は捨てようと思っていた。あえて自分で書いてまで出力しているのは単にNTCとの互換性を保持するため。しかし泣き言を言っても始まらないのでどう修正したものか考えてみた。
rdf:aboutには何を書くべきか
今まではrdf:aboutにゴーストの配布元サイトのURLを書いていた。RSSリーダーで購読する場合もリンク先には配布元を指定して直接飛べる方が便利だろう。しかし同一作者のゴーストが複数あった場合、配布元サイトURLは同じである場合が多い。これによって同一URIを複数itemのrdf:aboutに指定してしまい、Invalidとなっていた。
rdf:aboutはitem毎にユニークでなければならない。SiReFaSoに登録されているゴースト毎にユニークなキーはhomeurlだけだ(ゴースト名は重複を許容している)。つまりrdf:aboutにはhomeurlを指定するのが相応しい。でもちょっと待って。RSSリーダーで購読する際にhomeurlに飛ばされても誰も幸せにならない。大抵は404 Not Foundだ。GHOSTのルートフォルダにindex.htmlを入れてる人なんてそうはいない。てか、そこは配布ページじゃない。
ここで更なる疑問を抱く。item要素のrdf:about属性には一般的にURLを記述するが、item内にもlink要素というものを指定する。普通はrdf:aboutと同じURLを記述するようだが、異なっていても構わないらしい(互換性のために残された仕様?RSS 2.0にもlink要素がある)(そしてこれはユニークである必要がない)。一般的なRSSリーダーはどっちを読むのだろう?自分が作るとしたらRSS 2.0互換を考えてlink要素を優先するだろうなぁ、などと考えながらとりあえずRSS 1.0でrdf:aboutとlink要素にそれぞれ違うURLを指定してそのXMLをIE8、Firefox3.6.8、Opera10.60で表示してみた。以下がその結果。
- IE8: link要素のURLを使用
- Firefox3.6.8: link要素のURLを使用
- Opera10.60: link要素のURLを使用
rdf:aboutはユニークであれば何でもいい、という結論。でもhomeurlを指定するのはやはり抵抗がある。rdf:aboutを使って何かするエージェントがいないとも限らないし…。
RSSのitemのlinkに他所様のURLを指定するのでなく、自分のサイトの構造を定義してマークアップできたらベストだろうか。SiReFaSoにはゴースト毎の個別ページを実装すべきだったかもしれない。とりあえずゴースト名で検索した結果のページのURLをrdf:aboutに指定することにする。一般的なRSSリーダーはlink要素を読むだろうから今まで通り利便性は損なわれないし、仮にrdf:aboutを読んで検索結果に飛ばされてもあらためて配布元へのリンクが示されたページを拝めるし、rdf:aboutはユニークになる(ゴースト名の重複は許容しているけどゴーストマスタの良心を信じることにする)。
他のサイトはどうしてる?
マッシュアップ系のサイトでは同じような問題を抱えているのではないだろうか。RSS 1.0を配信している他所様のサイトもValidation Checkしてみた。
- SSP 一括更新用RSS: Invalid
- Disc-2 伺か投稿ニュースRSS: Invalid
- Hatena::Antenna: Invalid
自分のサイト内の記事であればパーマリンクもユニークだろうけど、やはりというか、他所のリンク集的なものや自由投稿形式のものはURI被りまで想定していないようだ。ちなみにいずれもrdf:about属性とlink要素内テキストは同一のURLが指定されていた。あえて別々のURLを指定するのも今回のような特殊な事情が無い限りするべきではないかもしれない。