実用的な XML: RSS や Atom フィードを身近にする

RSS や Atom 入門者のための賢明な選択肢

RSS フィードと Atom フィードは、雨後の筍のように次々に生まれています。その人気の理由は、そのサイトに関心を持つ訪問者がサイトに登録し、更新通知を受けられる、単純な機構が提供されているためです。それでもこうしたフィードは、特に古いブラウザーを使っているユーザーにとっては、必ずしも手軽なものではありません。この記事では、著者の Benoît が、サイト訪問者が RSS や Atom のフィードを手軽に読め、理解できるようにするための手法について解説します。

Benoit Marchal (bmarchal@pineapplesoft.com), Consultant, Pineapplesoft

Benoit MarchalBenoit Marchal氏は、ベルギーのナミュールを拠点にしたコンサルタントおよび著述家です。彼の著作には、XML by Example(Que社、邦訳: インプレス社「実例で学ぶXML」) と、Applied XML Solutions とがあります。Gamelanにコラムを寄せています。 Ben氏は、1998年にPineapplesoft Linkを設立したときに、e-zineの発行についてじかに学びました。www.marchal.com のサイトで、彼のe-zineを購読したり、彼の最新プロジェクトを詳しく見ることができます。



2006年 10月 24日

より幅広い利用者を相手にする

RSS フィードや Atom フィードは、訪問者がサイトを購読し、また新アイテム追加の通知を受けるための、非常に効果的なソリューションです。こうしたフィードの人気が急激に高まっている理由の 1 つは、サイト訪問者が自分たちのプライバシーを気にするようになり、またスパム攻撃を警戒するようになってきたためです。Atom や RSS を利用することによって、サイト訪問者は個人データを提供しなくても、そのサイトとの接触を続けることができます。

RSS はブログによって非常に一般的なものとなりましたが、ブログに限定されたものではありません。どんなサイトも、忠実な読者層を構築することで得られるものがあるのです。

Web マスターにとって難しいのは、RSS や Atom はまだまだ新しいものであり、知っている人は非常に少なく、使い方を理解し、適切なソフトウェアをインストールしている人はもっと少ない、という現実です。

特に難しいのは、訪問者が購読できるように Web サイト上に RSS または Atom ファイルへのリンクを置く必要がありますが、そのリンクをクリックすると、多くの訪問者には XML コードが表示されてしまう問題です。これはあまり望ましい姿ではありません。

Web シンジケーションは過渡期にあります。その利点は既に理解されており、Web サイトに RSS を組み込む価値はありますが、多くのユーザーは RSS フィードを適切に購読するための準備ができていません。Apple の Safari は、RSS サポートが組み込まれた最初の主要なブラウザーでした (2005 年)。その後すぐに、Firefox (version 1.5) や Internet Explorer (version 7)、Opera (version 9) が続きました。

来年の今頃になれば、主なブラウザーはどれも、優れた RSS サポートを実現しているでしょう。ただし大部分のユーザーがそれらにアップグレードするには、さらに 1 年か 2 年かかると思われるので、すべての訪問者が RSS 対応のブラウザーを持っていると想定できるようになるのは、今から数年先のことでしょう。

それまでの間は、ほとんどすべてのブラウザーで動作する代替手段を提供しなければなりません。


RSS は XML なので、XML として扱うべきです

何が起こるのでしょう?考えてみてください。RSS や Atom フィードは XML 文書です。ユーザーがそのフィードをクリックすると、ブラウザーはその文書をダウンロードし、それを XML として、つまり生のコードとして表示しようとします。さらに具合の悪いことに、一部のバージョンの Internet Explorer では、セキュリティー警告が表示されてしまいます。

この状況は単純ではありません。技術的には、RSS フィードは application/rss+xml という MIME タイプを持つはずであり、Atom フィードは application/atom+xml として識別されるはずです。もし MIME タイプが正しく、訪問者が自分のマシンでニュースのアグリゲーターを適切に設定してあれば、ブラウザーは自動的にそれを起動するはずです。

しかし実際には、適切な設定を行っている訪問者は稀なので、たいていの場合、訪問者は不可解なエラー・メッセージを見る羽目になります。そのため大部分の Web サイトでは、MIME タイプに text/xml または application/xml を使っています。これは正しくありませんが、少なくともブラウザーは生の XML コードを表示します。エラー・メッセージに比べれば改善されているのは確かですが、まだ改善の余地があります。

さらに悪いことに、一部のサイトでは設定を誤って、XML 文書を application/octet-stream として提供しています。Web マスターは、最も適切な MIME タイプを使うようにサーバーの設定を更新する必要があります。例えば一般的な Apache Web サーバーでは、この設定は .htaccess ファイルの中で行います。

問題を軽減するため、最近のブラウザーでは、ブラウザーで開く XML ファイルを検知し、適切にカテゴリー分けするようにしています。検知という意味は単純で、RSS または Atom のタグがないかどうか、最初の数バイトを読み取るのです。しかしこれも、RSS を認識するブラウザーを使うように訪問者に要求することは同じです。

スタイルシートが救いに

幸い、もっと良いソリューションがあります。XSLT スタイルシートを使うのです。もしブラウザーがフィードを XML 文書として扱うのであれば、スタイルシートを使うことによって、きちんと意味の通る表示ができます。一方、もしブラウザーが RSS や Atom のフィードと認識した場合には、ブラウザーはスタイルシートを無視します。こうすれば、どちらも満足できるのです。

リスト 1 は、あるスタイルシートに関連付けられた RSS 文書です (私のポッドキャストからの抜粋です)。2 ライン目が xml-stylesheet 処理命令であることに注意してください。これはスタイルシートにつながる、重要なリンクです。href はスタイルシートへのパスです。

リスト 1. RSS の抜粋
<?xml version="1.0" encoding="utf-8"?>
<?xml-stylesheet type="text/xsl" href="rssfeed.xsl"?>
<rss>
<channel>
<title>Declencheur</title>
<link>http://www.declencheur.com/</link>
<description>Le podcast qui parle photos.</description>
<language>fr</language>
<pubDate>Tue, 11 Jul 2006 15:31:46 +0200</pubDate>
<item>
<title>Cadrage</title>
<link>http://www.declencheur.com/clic/archives/2006/07/esposito</link>
<description><![CDATA[<p>En 20 minutes, Nicolas nous resume son cours
d'esthetique. Il nous livre de nombreuses techniques, astuces et regles
d'esthetique pour ameliorer nos photos.</p>]]></description>
<pubDate>Mon, 03 Jul 2006 21:30:21 +0200</pubDate>
<enclosure length="34812500" type="audio/mpeg"
url="http://www.declencheur.com/clic/medias/2006/decl-2006-07-03.mp3" />
</item>
<item>
<title>Complement visuel : cadrage</title>
<link>http://www.declencheur.com/clic/archives/2006/07/esposito-visuel</link>
<description><![CDATA[<p>Le complement visuel de l'episode 6 est maintenant
disponible !</p>]]></description>
<pubDate>Sat, 01 Jul 2006 12:07:30 +0200</pubDate>
<enclosure length="2738765" type="application/pdf"
url="http://www.declencheur.com/clic/medias/2006/decl-2006-07-01.pdf"/>
</item>
</channel>
</rss>

リスト 2 はスタイルシートです。XSLT に慣れた人であれば、似たようなスタイルシートを数分で書けるでしょう。ただしここには注意すべき点が 1 つあります。それを次のサブセクションで説明します。XSLT を知っている人は途中をとばし、直接次のサブセクションに進んでください。XSLT に慣れていない人は、このシリーズで今後 RSS を処理するために最低限必要なことを、これから説明します。

リスト 2. XSLT スタイルシート
<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="1.0">

<xsl:output method="html"/>

<xsl:template match="/">
<html>
<head>
<title><xsl:value-of select="rss/channel/title"/></title>
<script type="text/javascript" src="xsl_mop-up.js"/>
</head>
<body onload="go_decoding();">
<h1><a href="{rss/channel/link}"><xsl:value-of select="rss/channel/title"/></a></h1>
<div id="cometestme" style="display:none;">
<xsl:text disable-output-escaping="yes">&</xsl:text>
</div>
<p>This is an RSS feed, you must install a news aggregator to subscribe to it.
This feed contains the following items:</p>
<p><xsl:value-of select="rss/channel/description"/></p>
<xsl:for-each select="rss/channel/item">
<h2><a href="{link}"><xsl:value-of select="title"/></a></h2>
<div name="decodeable">
<xsl:value-of select="description" disable-output-escaping="yes"/>
</div>
<xsl:if test="enclosure">
<p><a href="{enclosure/@url}">Extra...</a></p>
</xsl:if>
</xsl:for-each>
</body>
</html>
</xsl:template>

</xsl:stylesheet>

このスタイルシートが (RSS や Atom のストリームと同じく) XML 文書であること、そして (Atom 要素や RSS エクステンションと同じく) 名前空間を使っていることに注意してください。XML 文書では毎度のことですが、構文に注意する必要があります。具体的には、開始タグ (<p>) に対応して必ず終了タグ (</p>) があることを確認します。空のタグは特別な構文 (<br />) に従う必要があります。

このスタイルシートには、描画をコントロールする XSLT 命令 (名前空間 http://www.w3.org/1999/XSL/Transform の中にあります。リスト 2 では XSLT 命令は xsl 接頭辞で始まっています) と、ページのレイアウトをコントロールする HTML タグが含まれています。

皆さんが自分のサイトのレイアウトに合うようにリスト 2 を変更したい場合には、xsl:template 要素の内容を編集します。そして必ず XSLT 命令を保持するようにします。

必要な XSLT 命令は 4 つ、xsl:value-of と xsl:for-each と xsl:if、そして中括弧を使うことです。

xsl:value-of 命令は、RSS または Atom 文書から情報を抽出し、それを HTML に挿入します。この命令には、対象とする RSS または Atom 要素へのパスを持つ、select という属性が 1 つあります。

例えば、フィードのタイトルをコピーするためのパスは、(title 要素は channel の下に現れ、また channel は rss に含まれるので) rss/channel/title です。これを見るとわかるように、パスは要素を、RSS 文書の中に現れる順序で単純にリストします。

属性からデータをコピーするためには、属性名の前に @ を付け、rss/channel/item/enclosure/@url のようにします。

xsl:for-each はループ命令です。この命令は、(やはり select 属性で選択された) 一連の要素 (この場合は様々な item) に対してループを行います。スタイルシートは各アイテムに対して、基本的な情報 (タイトルや内容記述、エンクロージャーへのリンクなど) を出力します。

属性の中の (そして属性の中にしかない) 中括弧は、RSS または Atom フィードから情報を抽出します。これは通常のテキストに対して xsl:value-of がすることと同じです。スタイルシートでは、中括弧の中にいくつかの href 属性が含まれています。

最後になりましたが、もう 1 つ重要な点として、xsl:if 命令は、そのテストが成功した場合にのみ実行されます。リスト 2 での xsl:if は、エンクロージャー情報を出力する意味があるかどうか、あるいはエンクロージャー・タグがないかどうかをテストしています。

以上は XSLT のごく一部を解説したにすぎませんが、リスト 2 をうまく利用してコピー、ペーストすれば、皆さんのサイトのレイアウトに合うように調整できるはずです。XSLT についての完全なチュートリアルは、「参考文献」を参照してください。

もしスタイルシートが思ったように動作しない場合には、次の点を調べます。

  • ここで示したとおりに名前空間を宣言していること (xmlns:xsl 属性) を確認します。URI を変更してはいけません。
  • その文書が他の名前空間 (例えば iTunes エクステンションなど) を使っている場合には、それらも宣言してあることを確認します。
  • スタイルシートは動作しているようでも一部のデータを抽出できない場合には、おそらくパスの問題です (私が生徒に XSLT を教えている中で、不正なパスによる問題は 80% を占めています)。

大部分のフィード・エディターでは、必要な xml-stylesheet 命令を挿入できるようになっています。もしこれをサポートしていないエディターを使っている場合には、FeedBurner を使ってフィードを更新することができます。FeedBurner は、デフォルトの XSLT スタイルシートまで提供しています (「参考文献」を参照してください)。

Firefox の落とし穴

RSS や Atom の世界にとっては、Firefox が XSLT の disable-output-escaping をサポートしてくれたら素晴らしいのですが、残念ながらそうなっていません。

disable-output-escaping は XSLT の目立たない機能です。その目的は 1 つしかなく、他のタグ (例えば CDATA セクションなど) の中に現れるタグを処理します。そして RSS と Atom は、HTML コードを埋め込むために頻繁に CDATA セクションを使うのです。

disable-output-escaping を使うと、HTML タグをフィードから取り出し、HTML ページに直接挿入できるのですが、Firefox ではできません。Firefox は基本的にこの命令を無視するため、生の HTML コードが表示されることになります。

Firefox のコミュニティーでは、この動作が標準に準拠するものかどうか、少しばかり議論されてきました。いずれにせよ、これは問題であり、何らかのソリューションが必要です。

幸い、Sean M. Burke が、この制約を回避する賢明な JavaScript スクリプトを作ってくれました。Burke 氏は親切にも彼のコードをパブリック・ドメインに置いてくれたため、誰でも、どんなプロジェクトにも、これを利用することができます。「参考文献」には、彼のスクリプトのコピーへのリンクをあげてあります。

このスクリプトが動作するためには、スタイルシートは「cometestme」という ID を持つ div セクションを挿入する必要があります。またスタイルシートは、エスケープを必要とするすべてのアイテムを、「decodeable」という名前の段落に置く必要もあります。

最後に、HTML 文書をロードする際にはスクリプト (go_decoding()) をコールする必要があります。


スタイルシートの中では何をすべきか

RSS や Atom フィードの中にアイテムをリストすることは、ほんの第一歩にすぎません。つまりそのコンテンツは Web サイトの別の場所に既に置かれており、またフィードの目的は購読を促進することであって、コンテンツを複製することではありません。

一般的なソリューション

RSS や Atom フィードにXSLT スタイルシートを添付している Web マスターの大多数は、ニュース・アグリゲーターのインストールとフィードの購読方法についての説明も付け加えています。

これは適切なように思えますが、私の経験では、そうしたページを表示しても、訪問者がアグリゲーターをインストールすることはまずありません。ウィルスやトロイの木馬の可能性を考えると、ウェブ・サーフィンをする人は、ソフトウェアをインストールしてくださいという要求に疑いを持つのです。

そのため多くのサイトでは、訪問者にオンライン・アグリゲーター (Google Reader または Yahoo!) を利用するように指示しています。これは良い考えのように思えますが、それが効率的かどうか、私は疑問を持っています。訪問者が既に多くのフィードを購読しているのでない限り、新しいソフトウェアのインストールをためらうのと同じように、彼らが新しいサービスにサインアップする可能性は少ないものです。もし彼らがサインアップしたとしても、忘れずにオンライン・アグリゲーターを訪問する可能性はどの程度のものでしょうか。私の考えでは、もし彼らがそうしたサイトにブックマークを付けなければならないとしたら、むしろ私のサイトにブックマークを付けさせたいと思います。

枠の外で考える

私は個人的に、RSS-to-e-mail サービスを使って E メールで購読できるオプションを提供しています。どの訪問者も、必ず E メール・アドレスを持っていると考えられます。そこで、私は詳細の説明書を作成し、その中でこのオプションの概要を説明し、また非常に優れた E メール購読フォームも用意しました。その結果、私のポッドキャストへの訪問者の 5 分の 1 は、RSS で購読するよりも、E メールで購読したいと思っていることもわかりました。

RSS も Atom も技術的には優れたソリューションかもしれませんが、慣れたサービスには勝てません。多くの訪問者にとって、E メールは最も慣れ親しんだサービスなのです。

購読方法の説明を 2 度書かなくても済むように (そしてその 2 つが次第に違うものになってしまう危険を避けるため) 私はリスト 3 のスタイルシートを使いました。これはリスト 2 よりも単純であり、訪問者を私のサイトの通常のページに送るために、HTML リダイレクトを実装しています。

リスト 3. 最も単純なソリューションは、リダイレクトすることです
<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="1.0">

<xsl:output method="html"/>

<xsl:template match="rss/channel">
<html>
<head>
<title><xsl:value-of select="title"/></title>
<meta http-equiv="refresh"
content="0; url=http://www.declencheur.com/clic/archives/2006/03/abonnement" />
</head>
<body>
<h1><xsl:value-of select="title"/></h1>
<p>Welcome, you are on the RSS feed of <xsl:value-of select="title"/>.
The feed offers free subscription services for
<xsl:value-of select="title"/>.</p>
<p>In a moment, you will be redirected to a page with more instructions.
<a href="http://www.declencheur.com/clic/archives/2006/03/abonnement">
Click here</a> if the new page fails to open.</p>
</body>
</html>
</xsl:template>

</xsl:stylesheet>

訪問者が RSS フィードをクリックすると、その人が使っているブラウザーが RSS を認識しなければ、これはリダイレクトとして動作します。

この記事では、RSS や Atom のフィードを、さまざまな種類の訪問者にとって使いやすいものにする方法について説明しました。RSS や Atom フィードがもっと広く知られるようになるまで、こうした方法を安全策として用意しておいた方が無難です。

参考文献

学ぶために

  • 「シンジケーションの概要、(RSS) Really Simple Syndication」(Vincent Lauria 著、developerWorks、2006年6月) は RSS の入門として、なぜ RSS に人気があるのか、その利点、どんなフィード・リーダーがあるのか、どれが皆さんの要求に合うのか、などを解説しています。また、IBM が提供する RSS と Atom の購読についても学んでください。
  • RSS の仕様を調べてください。驚くほど読みやすく、RSS に関する詳細を学ぶことができます。
  • 「Atom 1.0 Syndication Formatの概要」(James Snell 著、developerWorks、2005年6月) は、RSS の代替として Atom を考慮すべきことを解説しています。
  • XSLT (Extensible Stylesheet Language Transformations) の要点を解説した、単純で実際的な「XSL ハンズオン」(Don Day 著、developerWorks、2000年5月) を読み、XSLTについて学んでください。
  • 「Process Atom 1.0 with XSLT tutorial」(Uche Ogbuji 著、developerWorks、2005年12月) を読み、XSLT と Atom について詳しく学んでください。
  • IBM XML および関連技術において IBM 認証開発者になる方法についてはこちらを参照してください。
  • developerWorks XML ゾーンの XML technical library には、広範な話題を網羅した技術記事やヒント、チュートリアル、技術標準、IBM レッドブックなどが用意されています。
  • developerWorks technical events and webcasts で最新情報を入手してください。

製品や技術を入手するために

  • Sean M. Burke の Web サイトから、JavaScript hack のオリジナルの指示書とコードをダウンロードしてください。
  • RSS エディターがスタイルシートをサポートしていない場合には、FeedBurner を使った方が良いかもしれません。
  • developerWorks RSS feeds を利用してコンテンツ・フィードについて学び、また事前定義された、またはカスタムの RSS フィードや Atom フィードを追加してください。そして developerWorks のコンテンツを皆さんのサイトで購読してください。
  • 皆さんの次期開発プロジェクトを、IBM trial software を使って構築してください。developerWorks から直接ダウンロードすることができます。

議論するために

コメント

developerWorks: サイン・イン

必須フィールドは(*)で示されます。


IBM ID が必要ですか?
IBM IDをお忘れですか?


パスワードをお忘れですか?
パスワードの変更

「送信する」をクリックすることにより、お客様は developerWorks のご使用条件に同意したことになります。 ご使用条件を読む

 


お客様が developerWorks に初めてサインインすると、お客様のプロフィールが作成されます。会社名を非表示とする選択を行わない限り、プロフィール内の情報(名前、国/地域や会社名)は公開され、投稿するコンテンツと一緒に表示されますが、いつでもこれらの情報を更新できます。

送信されたすべての情報は安全です。

ディスプレイ・ネームを選択してください



developerWorks に初めてサインインするとプロフィールが作成されますので、その際にディスプレイ・ネームを選択する必要があります。ディスプレイ・ネームは、お客様が developerWorks に投稿するコンテンツと一緒に表示されます。

ディスプレイ・ネームは、3文字から31文字の範囲で指定し、かつ developerWorks コミュニティーでユニークである必要があります。また、プライバシー上の理由でお客様の電子メール・アドレスは使用しないでください。

必須フィールドは(*)で示されます。

3文字から31文字の範囲で指定し

「送信する」をクリックすることにより、お客様は developerWorks のご使用条件に同意したことになります。 ご使用条件を読む

 


送信されたすべての情報は安全です。


static.content.url=http://www.ibm.com/developerworks/js/artrating/
SITE_ID=60
Zone=XML, Web development
ArticleID=243398
ArticleTitle=実用的な XML: RSS や Atom フィードを身近にする
publish-date=10242006