RSS 配信の際の留意点

ウェブウェア・オルグサイトで更新情報の RSS 配信を行う際に使用した方法、留意点などをご紹介します。

走り書き気味なので、技術的には「中級以上」の内容です。

参考リソース

1.沖ソフトウェア株式会社 資料室
http://www.okisoft.co.jp/esc/tsu/rss.html

2.The Web Kanzaki の「RSS — サイト情報の要約と公開」
http://www.kanzaki.com/docs/sw/rss.html
(1.のページでもトップで紹介されています。相変わらずこのサイトはすばらしい。)

3.インターネットマガジン 2005年8月号
http://internet.impress.co.jp/rim/index0508.php
RSSとは?や、周辺状況(使用されているアプリケーションなど)の紹介。
実装に必要な具体的な技術情報は殆んど含まれていませんが、とりあえずの入り口としてお勧めです。

RSS本体ファイルの作成について

EUC-JPは不適

EUC-JPを使用すると、正しく charset を指定していても文字化けするRSSリーダーがあるようです(My Yahoo! のRSSリーダ機能で体験)。文字コードはベストがおそらくUTF-8、それで無ければ Shift_JIS がよいようです。

ファイル拡張子に注意

作成するバージョンを RSS 1.0 にした場合、ファイル拡張子は 「.rdf」にするのが(行儀が)良い、とされているようですが、ウェブサーバが「.rdf」の拡張子のファイルに対応していないと、うまく読み取れないRSSリーダーがあるかもしれません。(「かも」という理由は後述。)

具体的には、拡張子が「.rdf」のファイルに関して、Content-Type として、「text/xml」を送信するようにする必要があります。

Apache の場合、conf ディレクトリにある mime.types の text/xml に関するエントリを変更します。

mime.types デフォルト

text/xml xml

mime.types 変更後

text/xml xml rdf

※ 実際は、もう一つ足した方がよいエントリがあります。(詳細後述。)

ウェブサーバの設定を変更できなければ、拡張子を 「.xml」にしてしまうとよいでしょう。

配信に際して

AutoDiscovery の設定

AutoDiscovery とは、そのウェブサイト(またはそのページ)がRSS配信を行っていることを分りやすく(アプリケーションに)伝えるために、共通の取決めをしましょう、という仕様です。

例えば、AutoDiscovery の設定がされたページを FireFox で閲覧すると、右下に「ライブブックマーク」のアイコンが表示され、RSS 配信を行っていることが分るようになります。

ざっと調べてみたのですが、今のところ、RFC があるなど明確な標準があるわけでは無さそうです。

AutoDiscovery の設定には、以下のようにタグを HTMLページの<HEAD>内に入れておきます。

AutoDiscovery 設定サンプル

<LINK rel="alternate" type="application/rss+xml"
title="web-ware.org 新着情報" href="/rss/whatsnew.rdf" />

rel 属性は 「alternate」が一般的なようです。

type 属性は、「application/atom+xml」など、RSSの形式によって別の値もとりえるようですが、試しに「application/rdf+xml」にしてみたところ、FireFox では認識されませんでした。

title 属性は、通常余り使用されないようです。

href 属性は、RSSファイル本体を指定します。相対パス、絶対パスどちらもOKです。

スタイルシートの指定

RSSを受信してもらうには、RSSフィード(RSSファイル)のURLをRSSリーダーに登録する必要があり、通常「RSS」や「RDF」というアイコン(オレンジやブルーに白抜き文字)にRSSファイルのURLをリンクしておきますが、まだ余り使用方法が一般的でないこともあり、単純にクリックしてXMLファイルが表示され、なにやら良く分らずそのままになってしまう、というサイト訪問者も多いはずです。

そこで、RSSファイルにXSL(スタイルシート)を指定し、ウェブブラウザで表示された場合は、スタイルシートで整形されたページが表示されるようにしておけば、そこにRSS配信に関する案内を含めることができます。
(この方法は、上記インターネットマガジン内で、サッポロビールのウェブサイトが利用している方法として紹介されていたものです。)

RSSファイル(つまり XMLファイル)にスタイルシートを適用させるには、RSSファイル内に、以下の記述をしておきます。

<?xml-stylesheet type="text/xsl" href="/rss/aboutrss.xsl" media="screen" ?>

href 属性には、スタイルシートのURLを指定します。

ここで重要になるのが、また拡張子「.xsl」へのウェブサーバの対応です。
ブラウザによっては、.xsl ファイルに正しく MIMEタイプ(Content-Type)「text/xml」が指定されていないと、XSLをスタイルシートとして読み込めないようです。

試したところでは、FireFox が正しいMIMEタイプでないとエラーとなり、IE と Netscape 7.1 は「text/plain」でもOKでした。
いずれもWindows環境なので、IEなどはパソコン自体に設定されたファイルタイプの設定が優先されるため、問題が起きないようです。

拡張子とファイルタイプの関連付けは、クライアント側のブラウザの設定によっても変更できますが、サーバから送信する時に正しく送っておくと確実です。

ということで、Apache の conf/mime.types のtext/xml エントリは以下のように編集します。

text/xml xml rdf xsl

実は、rdf に関しては、MIMEタイプの違い(text/plain を送信)によるエラーは体験しませんでした。上記「ファイル拡張子に注意」で「かも」と書いたのはこのためです。

今後出てくるRSSリーダーなどが全てそのようにおおらかとは限りませんので、設定できれば設定しておいた方がいいと思います。

スタイルシートに関する留意点

スタイルシート(XSLT)が初めて、という方は、以下の URL あたりから始めるとよいと思います。
http://www.atmarkit.co.jp/fxml/tanpatsu/10xslt/xslt01.html

ただし、この場合、いわゆる XSLT の深い知識は不要です。
ひとまず HTML 形式で RSS 配信の案内ページを作成し、それをXSLファイル内にコピーして組み込めば良いのですが、その際の変更点や留意点は以下の通りです。

閉じタグがないタグを <TAGNAME ATTR=”VALUE” /> 形式に変更する

HTMLでは通常閉じタグを記述しないタグを、XMLの閉じタグ省略形式に変更します。

META、IMG、HR、上述 AutoDiscovery の LINK などが対象になります。

変更前の例

<IMG SRC="/img/logo.gif" WIDTH="238" HEIGHT="43" ALT="LOGO">

変更後の例

<IMG SRC="/img/logo.gif" WIDTH="238" HEIGHT="43" ALT="LOGO" />

RSS ファイル用の XSL ファイルの雛型

RSSの案内を表示する、という目的だけの簡単なXSLファイルの雛型は以下の通りです。

XSLTプロセッサが文字コード変換をしてくれるので、XSLファイルの文字コードはRSSファイルの文字コードと違っていても構いません。

但し、正しく charset 宣言をする必要があります。HTML の META で文字コードを指定する部分に関しても同様です。

XSLTプロセッサは、各ファイルが指定された文字コードに関わらず、<xsl:output> のencoding の指定に従ってファイルを出力しますので、<?xml version=”1.0″ encoding=”EUC-JP” ?> 部分の encoding は、XSLファイルの文字コードと一致させ、HTML の META で指定する文字コードは、<xsl:output> の encoding の指定と同じにする必要があります。
(XSLファイル記述の文字コードと、出力の文字コードが違っていても構いません。)

HTMLファイルの場合、ファイル内に DTD宣言(「<!DOCTYPE 云々..>」)を書きますが、XML+XSL で表示させる場合、DTD宣言はプロセッサが付けてくれるので <xsl:template> 内には必要ありません。
<xsl:output> の doctype-public で DTD のバージョンを指定します。

<?xml version="1.0" encoding="EUC-JP" ?>
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="1.0">
<xsl:output method="html" indent="no"
doctype-public="-//W3C//DTD HTML 4.01 Transitional//EN" encoding="EUC-JP"/>

<!-- ドキュメント全体 -->
<xsl:template match="/">
<!-- コピーするHTMLのコーディングここから -->
<HTML LANG="ja">
<HEAD>
<META HTTP-EQUIV="content-type" CONTENT="text/html;CHARSET=EUC-JP" />
<LINK rel="alternate" type="application/rss+xml"
title="RSS" href="whatsnew.rdf" />
</HEAD>
<TITLE>更新情報の RSS 配信</TITLE>
<BODY BGCOLOR="#ffffff">

<!-- ここに内容を書きます -->

</BODY>
</HTML>
<!-- コピーするHTMLのコーディングここまで -->
</xsl:template>
</xsl:stylesheet>

空白によるスペーシングの違いに対応

スペーサー画像や表組みを使用してウェブページのレイアウトをしている場合、(このサイトのレイアウトもかなり旧いので、そういうコーディングをしていますが、)余計なスペースや改行が入ることで変に幅が広がったり、間にすき間が空いてしまうことがあります。

XML(RSS)+XSL の組み合わせで HTML画面を表示させる場合、XSLでは指定しなかったタグ内の空白が、閲覧する側のブラウザによってあるものとして解釈される場合があります。

例:XSL 内のコーディング(幅 2px の緑色の直線を表現)

<TR>
<TD BGCOLOR="#336633"><IMG SRC="/img/s.gif" WIDTH="1" HEIGHT="2" ALT=""></TD>
</TR>

例:ブラウザによって表示される時の解釈(予想)(緑色部分の幅が広がってしまう)

<TR>
<TD BGCOLOR="#336633">
<IMG SRC="/img/s.gif" WIDTH="1" HEIGHT="2" ALT="">
</TD>
</TR>

これは、どうやらどうしようもないので、タグの間に空白があると解釈されても問題のないコーディング(CSS によるスタイル指定など)に切り替える必要があります。

このサイトのRSS 配信に際しても、幅1ピクセルのテーブルセルで表現していた色付きの直線を、スタイルシートによる表現(border-bottom など)に切り替えました。

例:切り替え後のコーディング

<TR><TD STYLE="border-bottom: 2px solid #336633">○○○○○○</TD></TR>

(今まで直線を指定していた <TR> 行は削除し、内容の記載されている行のスタイルを変更します。)

RSS ファイル作成について

Perl の XML::RSS の使用について

Perl でRSS を作成する場合、XML::RSS モジュールも使用できますが、以下の点でちょっと不便です。

《不便な点》
・文字コードの変更を自分で行わなければならないこと。
channel@rdf:about と channel/link に常に同じURLしか指定できないこと。
・特定のモジュールを「使用しない」という設定ができないこと。
(xml 宣言中に含まれてしまう。)
・xml 宣言中に「xml:lang=”ja”」を含められないこと。

もしかしたらカスタマイズの方法があるのかも知れませんが、ドキュメントに記載が無いので、RSS 配信用位の規模であれば ゴリゴリ書いてもそんなに辛くはありません。

このサイトの配信に際しても、Perl でゴリゴリ print しました。

日付表記

dc:date や syn:updateBase に記載する形式のコーディング例です。

フルコースだと、日付表記「YYYY-MM-DD」と時刻表記「HH:MM:SS+09:00」を「T」という文字列で結んだ「YYYY-MM-DDTHH:MM:DD+09:00」というフォーマットになります。

RSS内の表記例

<dc:date>2005-09-25T06:08:10+09:00</dc:date>
<syn:updateBase>2005-09-25T06:08:10+09:00</syn:updateBase>

Perl でのフォーマット方法(日本標準時対応)

my @time = localtime;
$last_updated = sprintf("%04d-%02d-%02dT%02d:%02d:%02d+09:00",
$time[5]+1900,
$time[4]+1, $time[3], $time[2], $time[1], $time[0]);

PostreSQL タイムスタンプからのフォーマット方法(日本標準時対応)

データベースに更新コンテンツが記録されている場合、時刻を更新時のタイムスタンプから取得することができます。

PostgreSQL にも時刻形式変換関数がありますが、24時間制での時間表記を指定する「HH24」と、フォーマット上の固定文字列「T」が連続するのでそのままだと取得できません。
一旦別の形で取り出して、後で置換をします。

SQLの例

SELECT *,
to_char(release_date, 'YYYY-MM-DD T HH24:MI:SS+09:00') as last_updated
FROM MYTABLE
ORDER BY release_date desc
LIMIT 10
;

PostgreSQLから取得した日時表記の置換を行うPerlコードの例

$last_updated =~ s/ T /T/;

参考書

「標準XML 完全解説」(技術評論社)

XML SGMLサロン (著)

「XSLT Web開発者ガイド」(ピアソンエデュケーション)

クン・イー ファン (著), Khun Yee Fung (原著), 原 隆文 (翻訳)