ちょっとしたメモ

RSSのもうひとつのグループ化:manifestとchannels

taxonomyモジュールのことを書いたついでに、もう一つRSSの珍しいバリエーションのこともメモしておこう。JUGEMなどのウェブログのRSSに加わっているmanifestという名前空間と、最後の方にあるmn:channelsというプロパティだ。これはRSS 1.0誕生の頃、ひとつのフィードで複数のチャンネルを配信することを検討した名残で、別の形によるジャンルの表現と言ってもいい。

現在のRSSはひとつのチャンネルだけを持ち、各アイテムの分類やジャンルにはdc:subjecttaxo:topicsを用いるのが普通だ。これとは別の発想で、RSSの中に複数のチャンネルを持たせ、ジャンルごとにチャンネルを割り当てるという方法が、Edd DumbillのAddressing RSS's logical modelの中に記されている。ひとつのアイテムが複数のジャンルに属する場合は、それぞれのchannelからitemsのメンバーとして参照すればよい。そして、フィード内にどんなチャンネルがあるかを、manifest(目録)というIDをもつノードで、channelsプロパティを使って示す。

例えば、あるフィードにはFOAFWeblogというジャンルがあるとして、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:subjecttaxo:topicsによる分類がボトムアップ型とすれば、こちらはトップダウン型分類とでもいうところか。ジャンルごとの目次がすぐ分かって便利である一方、アグリゲータなどでitemをばらばらに切り出すとジャンル情報を見失ってしまうので、あまり使い勝手はよくないかも知れない。結局このchannelsはRSS 1.0では採用されなかったわけだが、Eddが提供するPHPのRSS生成ツールRSSWriterにその面影をとどめ、これを使って作られるRSSには、今もmanifest名前空間とchannels要素が含まれているのだ。

ところで、Eddの提案を読むと、更に以前のモデルでは、チャンネルとアイテムを結びつけるのはchannel内のitemsではなく、逆にitem内にinchannelという要素を置いて、ボトムアップで関連づけを行っていたことが分かる。そして、アイテムの順番を示すために、itempositionというプロパティを持っていた。これだと、複数のinchannel要素で複数のチャンネルにつなごうとしても、positionが混乱してしまってうまく行かない(Eddの図)。

これに対する案として出てきたのが、items/rdf:Seqchannel側に持つという、現在のモデルなのだった。RDF 1.0が難しそうに思える要因とされがちなitems/rdf:Seqだが、順序を示すことが重要だった経緯を見ると、少し納得できるような気がするという、歴史のお話。

関連メモ:
map - genre: rss. at