XML工房

〔作品3〕簡易RSSビューアの作成

~第1章~ RSSファイルに触れてみる

2006年5月号掲載記事

こんにちは、サイバーテックの山口です。

最近ブログなどを手軽に始められるサービスが充実していることもあり個人が作成しているコンテンツもとても増えました。これらを気に入って定期的にチェックしている方も多いと思います。

数が少ないうちは手動でウェブサイトを巡回して更新をチェックするのも気になりませんが、巡回するウェブサイトの数が多くなると更新された部分のみ自動でピックアップしたくなります。この目的のために「RSSリーダ」と呼ばれるアプリケーションが数多く登場しています。

RSSリーダが更新を検知できるのはウェブサイトがRSSという規格のXMLファイルを提供しているためです。
HTMLの中にコンテンツの更新情報を記述した特別なコメントを埋め込み更新チェッカアプリケーションはそれを検出する方法なども存在しましたが広く普及するまでには至りませんでした。

多くのブログ作成ツールがRSSをサポートしたことなどが今日の普及への追い風になったと思われますがRSSがXMLであるためこれを処理するアプリケーションを作りやすいことも大きな理由の一つでしょう。

一口にRSSといっても用途や歴史的な経緯によって複数の形式が存在しますが今回はRSS 1.0を対象に簡易RSSビューアを作成してみたいと思います。

rss-exsample.xml

<?xml version="1.0"?>

<rdf:RDF
 xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
 xmlns="http://purl.org/rss/1.0/"
>

 <channel rdf:about="http://www.xml.com/xml/news.rss">
  <title>XML.com</title>
  <link>http://xml.com/pub</link>
  <description>
   XML.com features a rich mix of information and services
   for the XML community.
  </description>

  <image rdf:resource="http://xml.com/universal/images/xml_tiny.gif" />

  <items>
   <rdf:Seq>
    <rdf:li resource="http://xml.com/pub/2000/08/09/xslt/xslt.html" />
    <rdf:li resource="http://xml.com/pub/2000/08/09/rdfdb/index.html" />
   </rdf:Seq>
  </items>

  <textinput rdf:resource="http://search.xml.com" />

 </channel>
 
 <image rdf:about="http://xml.com/universal/images/xml_tiny.gif">
  <title>XML.com</title>
  <link>http://www.xml.com</link>
  <url>http://xml.com/universal/images/xml_tiny.gif</url>
 </image>
 
 <item rdf:about="http://xml.com/pub/2000/08/09/xslt/xslt.html">
  <title>Processing Inclusions with XSLT</title>
  <link>http://xml.com/pub/2000/08/09/xslt/xslt.html</link>
  <description>
   Processing document inclusions with general XML tools can be
   problematic. This article proposes a way of preserving inclusion
   information through SAX-based processing.
  </description>
 </item>
 
 <item rdf:about="http://xml.com/pub/2000/08/09/rdfdb/index.html">
  <title>Putting RDF to Work</title>
  <link>http://xml.com/pub/2000/08/09/rdfdb/index.html</link>
  <description>
   Tool and API support for the Resource Description Framework
   is slowly coming of age. Edd Dumbill takes a look at RDFDB,
   one of the most exciting new RDF toolkits.
  </description>
 </item>

 <textinput rdf:about="http://search.xml.com">
  <title>Search XML.com</title>
  <description>Search XML.com's XML collection</description>
  <name>s</name>
  <link>http://search.xml.com</link>
 </textinput>

</rdf:RDF>

これはRSS 1.0の仕様書(http://purl.org/rss/1.0/spec)から引用したRSSファイルの例です。

ざっと眺めてみると1つのchannel要素と複数のitem要素によって構成されていることが分かります。またchannel要素とitem要素の子要素としてtitle, link, description要素がそれぞれ存在することも確認できます。これらをHTMLとして表示するために次のようなXSLTスタイルシートを作成しました。

rss-example.xsl

<?xml version="1.0" encoding="Shift_JIS"?>
<xsl:stylesheet version="1.0"
 xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
 xmlns:rss="http://purl.org/rss/1.0/"
 xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
>
 <xsl:output method="html" />

 <xsl:template match="/">
  <html>
   <head>
    <!-- channel のタイトルを HTML の title として出力 -->
    <title><xsl:value-of select="/rdf:RDF/rss:channel/rss:title" /></title>
   </head>
   <body>
    <!-- channel のタイトルを見出しとして出力-->
    <h1><xsl:value-of select="/rdf:RDF/rss:channel/rss:title" /></h1>
    <br />
    <!-- channel の説明を出力 -->
    <xsl:value-of select="/rdf:RDF/rss:channel/rss:description" />
    <hr />
    <!-- item の繰り返しを処理-->
    <xsl:for-each select="/rdf:RDF/rss:item">
     <h2>
      <a>
      <xsl:attribute name="href">
      <!-- ここでは rdf:about 属性からリンク先を取得 -->
       <xsl:value-of select="@rdf:about" />
       </xsl:attribute>
       <!-- item のタイトルを出力 -->
       <xsl:value-of select="rss:title" />
      </a>
     </h2>
     <div>
      <!-- item の説明を出力 -->
      <xsl:value-of select="rss:description" />
     </div>
    </xsl:for-each>
   </body>
  </html>
 </xsl:template>

</xsl:stylesheet>

結果のHTMLをブラウザで表示するために、rss-example.xmlファイルにxsl-stylesheet処理命令を記述してrss-example.xslを関連付けます。

rss-example.xml

<?xml version="1.0"?>

<!-- ↓これを追加 -->
<?xml-stylesheet href="rss-example.xsl" type="text/xsl"?>

<rdf:RDF (以下略)

rss-example.xml ファイルをブラウザで開いてみてください。
対応しているブラウザであれば次のような画面が表示されるはずです。

XSLTスタイルシートではvalue-of要素、for-each要素を使いこなすだけでもやりたいことがかなり実現できると思います。上記のXSLTスタイルシートは殆ど出力結果のHTMLの構造のままですので比較的易しいかと思いますが、私がXSLTスタイルシートの学習を始めたときには次のところで躓いた覚えがあります。

1つ目はXML名前空間の扱いについてです。
今回の例ですと rss-example.xml ではデフォルト名前空間としてRSSが宣言されているため、channel要素やtitle要素などにはrdf:のような接頭辞がついていません。

<rdf:RDF
 xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
 xmlns="http://purl.org/rss/1.0/" ←ここで宣言
>

この部分を忘れてXSLTスタイルシートで次のような記述をした場合には期待した出力がされません。

<title><xsl:value-of select="rdf:RDF/channel/title" /></title>

この場合はRSS名前空間の接頭辞とURIを宣言してその接頭辞を用いることによって期待通りの出力をさせることができます。

2つ目はHTMLの属性の値の設定方法です。
最初に試みたのは次のような記述です。

<a href="<xsl:value-of select="@rdf:RDF" />">
 <xsl:value-of select="rss:title" />
</a>

XSLTスタイルシートはそれ自身でもXMLとして成立していないといけませんので属性の値には「<」や「"」は使用できませんし、これらの文字をエスケープしたとしてもこの部分がXSLTエンジンに処理されるわけではありません。

xsl:attibute要素を知っていればすんなりと解決することですが最初はいろいろ悩んでしまった記憶があります。

ところでRSSは実際のウェブサイトが提供しているものを表示させてみないと面白くないと思いますので、次回は HTML + JavaScript とブラウザを使用して簡単なRSSビューアを作成してみたいと思います。

株式会社サイバーテック
ソフトウェア開発部
山口 洋一
http://www.cybertech.co.jp/

続きを読む →

「XML工房」のIndexへ戻る

ページトップへ▲

HOMEへ戻る