January 25, 2004

Atom を RSS へ XSLT 変換するゲートウェイ

[ Perl , XML ]
I posted some XSL stylesheets for munging Atom (0.3) into RSS 1.0 and RSS 2.0 . At the moment there are only stylesheets for munging so-called minimal Atom feeds. I will get around to the fancier feeds, but don't hold your breath. If someone wants to take the work and run with it, please feel free to do so.

this is aaronland というウェブログで、Atom 0.3 フィードを RSS に変換する XSLT が公開されていました。(via Lockergnome's RSS Resource) XSLT はこちらにあります。

この XSLT で Atom フィードを RSS に変換してしまえば、RSS にしか対応していないクライアントでもフィードを読むことができます。そこで、この XSLT を使って Atom から RSS へ変換するゲートウェイCGIを書いてみました。

と、スクリプトを紹介する前に XSLT をちょっと改造しました。以下そのパッチ。

8a9
>     xmlns:content="http://purl.org/rss/1.0/modules/content/"
74c75
<     <description />
---
>     <description><xsl:value-of select="/f:feed/f:tagline" /></description>
79a81
>     <dc:date><xsl:value-of select="/f:feed/f:modified" /></dc:date>
109a112,121
>
>    <description>
>      <xsl:value-of select="f:summary" />
>    </description>
>
>    <xsl:if test="f:content">
>      <content:encoded>
>        <xsl:value-of select="f:content"/>
>      </content:encoded>
>    </xsl:if>
110a123
>    <dc:date><xsl:value-of select = "f:issued" /></dc:date>

オリジナルのままだと、description や dc:date など、現在流通している RSS リーダーに重要な要素が入っていないので、それを追加。ついでなので content:encoded も入れるようにしました。

以下、スクリプト。URL パラメータに与えられた URL から LWP::UserAgent で Atom フィードを取得し、XML::LibXSLT にパッチを当てた XSLT を渡し、RSS 1.0 に変換して出力します。

#!/usr/local/bin/perl
use strict;
use warnings;
use XML::LibXSLT;
use XML::LibXML;
use Digest::MD5 qw (md5_hex);
use LWP::UserAgent;
use CGI;
use CGI::Carp qw(fatalsToBrowser);
 
our $cache_dir = "./cache";
our $style_file = "minimal-to-rss-1.0.xsl";
mkdir $cache_dir, 0755 unless -e $cache_dir;
 
my $q = CGI->new;
print $q->header( -type => 'text/xml' );
 
my $url = $q->param("u") or die "cannot get atom url\n";
die "invalid url"
    unless ($url =~ /^http:\/\/.*?(\.atom|\.xml)$/);
 
my $digest = md5_hex($url);
my $source_file  = "$cache_dir/$digest.xml";
 
my $ua = LWP::UserAgent->new;
my $response = $ua->mirror($url, $source_file);
 
if ($response->is_error) {
    die sprintf("request failed. (%d: %s)\n", 
                $response->code, $response->message);
} else {
    # convert atom to RSS 1.0 with XML::LibXSLT
    my $parser = XML::LibXML->new;
    my $xslt   = XML::LibXSLT->new;
    my $stylesheet = $xslt->parse_stylesheet_file( $style_file );
    my $source_doc = $parser->parse_file( $source_file );
    my $result = $stylesheet->transform( $source_doc );
    print $stylesheet->output_string( $result );
}

このスクリプトを使って NDO::Weblog の Atom フィードを RSS 1.0 に変換した結果はこちら。rdf:li の resource 属性の値の URI が、Atom の id になっていたり、dc:created や dc:date-x-metadatalastmodified など見慣れない要素が入っていたりはしますが、とりあえず RSS リーダーで読む文には影響はない様子。

dc:created、dc:date-x-metadatalastmodified は検索すると何やら引っかかりますが、どういう時に使うものなのかよくわかりません。Dublin Core Metadata Element Set, Version 1.1 には見当たらないような。

Posted by naoya at January 25, 2004 05:11 AM | トラックバック (1)  b_entry.gif
トラックバック [1件]
TrackBack URL: http://mt.bloghackers.net/mt/suck-tbspams.cgi/835
Atom を RSS へ XSLT 変換するゲートウェイ
Excerpt: Atom を RSS へ XSLT 変換するゲートウェイ : NDO::Weblog NDO::Weblog様による記事の話 Atom0.3フィードをRSS...
Weblog: my weblog
Tracked: November 9, 2004 04:21 PM
コメント [0件]