taxonomyモジュールのことを書いたついでに、もう一つRSSの珍しいバリエーションのこともメモしておこう。JUGEMなどのウェブログのRSSに加わっているmanifestという名前空間と、最後の方にあるmn:channelsというプロパティだ。これはRSS 1.0誕生の頃、ひとつのフィードで複数のチャンネルを配信することを検討した名残で、別の形によるジャンルの表現と言ってもいい。
現在のRSSはひとつのチャンネルだけを持ち、各アイテムの分類やジャンルにはdc:subject
やtaxo:topics
を用いるのが普通だ。これとは別の発想で、RSSの中に複数のチャンネルを持たせ、ジャンルごとにチャンネルを割り当てるという方法が、Edd DumbillのAddressing RSS's logical modelの中に記されている。ひとつのアイテムが複数のジャンルに属する場合は、それぞれのchannel
からitems
のメンバーとして参照すればよい。そして、フィード内にどんなチャンネルがあるかを、manifest(目録)というIDをもつノードで、channels
プロパティを使って示す。
例えば、あるフィードにはFOAFとWeblogというジャンルがあるとして、item1はFOAF、item2はWeblog、item3はFOAFとWeblog両方に属するとする。今のRSSなら、これらのキーワードをdc:subject
、あるいはtaxo:topics
としてitem
要素内に記述するわけだ。これをEddの方法に従ってチャンネルの使い分けで示すと次のような具合になる。
(例)
<rdf:RDF xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#" xmlns="http://purl.org/rss/1.0/" xmlns:mn="http://usefulinc.com/rss/manifest/
" > <channel rdf:about="http://example.org/FOAF
"> ... <items> <rdf:Seq> <rdf:li rdf:resource="http://example.org/article1
"/> <rdf:li rdf:resource="http://example.org/article3
"/> </rdf:Seq> </items> </channel> <channel rdf:about="http://example.org/Weblog
"> ... <items> <rdf:Seq> <rdf:li rdf:resource="http://example.org/article2
"/> <rdf:li rdf:resource="http://example.org/article3
"/> </rdf:Seq> </items> </channel> <item rdf:about="http://example.org/article1
"> ... <item rdf:about="http://example.org/article2
"> ... <item rdf:about="http://example.org/article3
"> ... <rdf:Description rdf:ID="manifest"> <mn:channels
> <rdf:Seq> <rdf:li rdf:resource="http://example.org/FOAF
"/> <rdf:li rdf:resource="http://example.org/Weblog
"/> </rdf:Seq> </mn:channels> </rdf:Description> </rdf:RDF>
dc:subject
やtaxo:topics
による分類がボトムアップ型とすれば、こちらはトップダウン型分類とでもいうところか。ジャンルごとの目次がすぐ分かって便利である一方、アグリゲータなどでitem
をばらばらに切り出すとジャンル情報を見失ってしまうので、あまり使い勝手はよくないかも知れない。結局このchannels
はRSS 1.0では採用されなかったわけだが、Eddが提供するPHPのRSS生成ツールRSSWriterにその面影をとどめ、これを使って作られるRSSには、今もmanifest名前空間とchannels
要素が含まれているのだ。
ところで、Eddの提案を読むと、更に以前のモデルでは、チャンネルとアイテムを結びつけるのはchannel
内のitems
ではなく、逆にitem
内にinchannel
という要素を置いて、ボトムアップで関連づけを行っていたことが分かる。そして、アイテムの順番を示すために、item
がposition
というプロパティを持っていた。これだと、複数のinchannel
要素で複数のチャンネルにつなごうとしても、position
が混乱してしまってうまく行かない(Eddの図)。
これに対する案として出てきたのが、items
/rdf:Seq
をchannel
側に持つという、現在のモデルなのだった。RDF 1.0が難しそうに思える要因とされがちなitems
/rdf:Seq
だが、順序を示すことが重要だった経緯を見ると、少し納得できるような気がするという、歴史のお話。
- RSSのtaxonomyモジュール (2004-03-02)