RSSを作る

はじめに

RSS(RDF Site Summary)で更新内容を公開してみることにした.難しいことはしていなくて,トップページの新着に書いてある内容をRSSにしてみただけである.「RSSとは何なのか?」については,参考サイトを参照したほうが早いと思う.

更新は毎週日曜日だし,更新内容もたいしたことはない.果たして利用価値があるのかどうかについては・・・.まあ,細かいことは作ってから考えるとしよう.

RSSに記述する内容

上述した通り,公開する内容はトップページの新着に書いた内容である.2004.1.4の新着のHTMLは以下の通りとなる.

<dt><a href="whatsnew/index.html">新着</a></dt>
  <dd>
    2004.1.4
    <ul>
      <li><a href="saijiki/index.html">歳時記</a>に2003.12.28から2004.1.3までを追加.</li>
      <li><a href="links/index.html">リンク</a>に「東急東横線目黒線・新丸子タウン情報マップ」を追加.</li>
    </ul>
  </dd>
</dl>
        

これの元になるXMLは以下の通り.全文は付録につけたので,興味のある方は参照してほしい.

<content href="whatsnew/index.html" name="新着">
  2004.1.4
  <ul>
    <li><a href="saijiki/index.html">歳時記</a>に2003.12.28から2004.1.3までを追加.</li>
    <li><a href="links/index.html">リンク</a>に「東急東横線目黒線・新丸子タウン情報マップ」を追加.</li>
  </ul>
</content>
        

このXMLからRSSを作るXSLTを用意することになる.

HeadLine-Editorで作ってみた

いきなりXSLTを書き始めても訳が分からなくなりそうなので,とりあえずサンプルをHeadline-Editor Liteで作ってみた.

以下のようなRSSができた.なるほど,こんな風に作れば良いわけだな.

<?xml version="1.0" encoding="utf-8" ?>

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

  <channel rdf:about="http://www.dab.hi-ho.ne.jp/sasa/rss/whatsnew.rdf">
    <title>眠る猫の頁</title>
    <link>http://www.dab.hi-ho.ne.jp/sasa/</link>
    <dc:date>2004-01-02T21:26:13+09:00</dc:date>
    <items>
      <rdf:Seq>
        <rdf:li rdf:resource="http://www.dab.hi-ho.ne.jp/sasa/biboroku/index.html"/>
        <rdf:li rdf:resource="http://www.dab.hi-ho.ne.jp/sasa/saijiki/index.html"/>
      </rdf:Seq>
    </items>
  </channel>


  <item rdf:about="http://www.dab.hi-ho.ne.jp/sasa/biboroku/index.html">
    <title>リンク</title>
    <link>http://www.dab.hi-ho.ne.jp/sasa/biboroku/index.html</link>
    <dc:date>2004-1-4</dc:date>
    <description>「東急東横線目黒線・新丸子タウン情報マップ」を追加.</description>
  </item>

  <item rdf:about="http://www.dab.hi-ho.ne.jp/sasa/saijiki/index.html">
    <title>新着</title>
    <link>http://www.dab.hi-ho.ne.jp/sasa/saijiki/index.html</link>
    <dc:date>2004-1-4</dc:date>
    <description>2003.12.28から2004.1.3までを追加.</description>
  </item>

</rdf:RDF>
        

XSLT作成

ということで作ってみた.日付の形式をDoublin Coreモジュールにあわせて変換している(2004.1.4→2004-01-04)ぐらいで,それほど凝ったことはやっていない.また,便利そうだったのでHeadline-Editor Lite版にはなかったSyndicationモジュールを追加している.

<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet
  xmlns="http://purl.org/rss/1.0/"
  xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
  xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
  xmlns:dc="http://purl.org/dc/elements/1.1/"
  xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
  version="1.0">
  <xsl:output
    method="xml"
    encoding="utf-8"
    indent="yes"/>

  <xsl:variable name="base" select="'http://www.dab.hi-ho.ne.jp/sasa/'"/>

  <!-- Doublin Coreに合わせて日付の形式をyyyy.m.dからyyyy-mm-ddに変換 -->
  <xsl:template name="update">
    <xsl:variable name="update"
      select="normalize-space(/root/content[@name='新着']/text())"/>
    <!-- /root/content[@name='新着']/text()だけだと不要な空白/改行が残る.normalize-spaceでそれらを削除 -->
    <xsl:variable name="yyyy"
      select="format-number(substring-before($update,'.'),'0000')"/>
    <xsl:variable name="mm"
      select="format-number(substring-before(substring-after($update,'.'),'.'),'00')"/>
    <xsl:variable name="dd"
      select="format-number(substring-after(substring-after($update,'.'),'.'),'00')"/>
    <xsl:value-of select="concat($yyyy,'-',$mm,'-',$dd)"/>
  </xsl:template>

  <xsl:template match="/">
    <rdf:RDF xml:lang="ja">
      <channel rdf:about="{concat($base,'rss/whatsnew.rdf')}">
        <title><xsl:value-of select="/root/@title"/></title>
        <link><xsl:value-of select="concat($base,'index.html')"/></link>
        <description>日々思うことやシステム開発の小技について</description>
        <dc:creator>foo@bar</dc:creator>
        <dc:date><xsl:call-template name="update"/></dc:date>
        <dc:language>ja</dc:language>
        <!-- Syndicationモジュールの記述を追加 -->
        <sy:updatePeriod>weekly</sy:updatePeriod>
        <sy:updateFrequency>1</sy:updateFrequency>
        <sy:updateBase><xsl:call-template name="update"/></sy:updateBase>
        <items>
          <rdf:Seq>
            <xsl:apply-templates select="/root/content[@name='新着']/ul/li/a"/>
          </rdf:Seq>
        </items>
      </channel>
      <xsl:apply-templates select="/root/content[@name='新着']/ul/li"/>
    </rdf:RDF>
  </xsl:template>

  <xsl:template match="/root/content[@name='新着']/ul/li/a">
    <rdf:li rdf:resource="{concat($base,@href)}"/>
  </xsl:template>

  <xsl:template match="/root/content[@name='新着']/ul/li">
    <item rdf:about="{concat($base,a/@href)}">
      <title><xsl:value-of select="a/text()"/></title>
      <link><xsl:value-of select="concat($base,a/@href)"/></link>
      <dc:date><xsl:call-template name="update"/></dc:date>
      <description><xsl:value-of select="."/></description>
    </item>
  </xsl:template>
</xsl:stylesheet>
        

できたRSSは以下の通り.XSLTプロセッサのXTを使ってXMLからRSSへの変換を行っている.また,なぜか字下がうまい具合にできず,実際は字下げのない状態でできる.そのままだと見にくいので整形してある.

<?xml version="1.0" encoding="utf-8"?>
<rdf:RDF
  xml:lang="ja"
  xmlns:dc="http://purl.org/dc/elements/1.1/"
  xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
  xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
  xmlns="http://purl.org/rss/1.0/">

  <channel rdf:about="http://www.dab.hi-ho.ne.jp/sasa/rss/whatsnew.rdf">
    <title>眠る猫の頁</title>
    <link>http://www.dab.hi-ho.ne.jp/sasa/index.html</link>
    <description>日々思うことやシステム開発の小技について</description>
    <dc:creator>foo@bar</dc:creator>
    <dc:date>2004-01-04</dc:date>
    <dc:language>ja</dc:language>
    <sy:updatePeriod>weekly</sy:updatePeriod>
    <sy:updateFrequency>1</sy:updateFrequency>
    <sy:updateBase>2004-01-04</sy:updateBase>
    <items>
      <rdf:Seq>
        <rdf:li rdf:resource="http://www.dab.hi-ho.ne.jp/sasa/saijiki/index.html"/>
        <rdf:li rdf:resource="http://www.dab.hi-ho.ne.jp/sasa/links/index.html"/>
      </rdf:Seq>
    </items>
  </channel>

  <item rdf:about="http://www.dab.hi-ho.ne.jp/sasa/saijiki/index.html">
    <title>歳時記</title>
    <link>http://www.dab.hi-ho.ne.jp/sasa/saijiki/index.html</link>
    <dc:date>2004-01-04</dc:date>
    <description>歳時記に2003.12.28から2004.1.3までを追加.</description>
  </item>

  <item rdf:about="http://www.dab.hi-ho.ne.jp/sasa/links/index.html">
    <title>リンク</title>
    <link>http://www.dab.hi-ho.ne.jp/sasa/links/index.html</link>
    <dc:date>2004-01-04</dc:date>
    <description>リンクに「東急東横線目黒線・新丸子タウン情報マップ」を追加.</description>
  </item>
</rdf:RDF>
  

参考サイト

The Web KANZAKI/RSS -- サイト情報の要約と公開
“RSS RDF”検索文字にしてGoogleで検索すると一番最初に出てくる.それだけのことはあって,大変分かりやすい.
@IT/サイトの更新情報を提供する標準言語RSS
三部構成で概要は一番最初の記事.
InfoMaker
RSSエディタのHeadLine-Editor LiteやRSSリーダのHeadLine-Readerをダウンロード可能.作成するRSSファイルの元となるファイルの作成や,作ったRSSの検証にこの二つのソフトを使用した.
RSS Reader Panel
Mozilla FirebirdにRSS読込み機能を追加するextension.
Feed Validator for Atom and RSS
RSSバリデータ.
W3C RDF Validation Service
RSSバリデータ.
XT
XSLTプロセッサ

付録

RSSの元になったXMLファイルの全文である.

<?xml version="1.0" encoding="UTF-8"?>
<root title="眠る猫の頁">
  <img width="333" height="250" src="cat.jpg" alt=""/>

  <content href="whatsnew/index.html" name="新着">
    2004.1.4
    <ul>
      <li><a href="saijiki/index.html">歳時記</a>に2002.12.28から2003.1.3までを追加.</li>
      <li><a href="links/index.html">リンク</a>に「東急東横線目黒線・新丸子タウン情報マップ」を追加.</li>
    </ul>
  </content>

  <content href="saijiki/index.html" name="歳時記">
    日々の出来事など.
  </content>

  <content href="http://www.paw.hi-ho.ne.jp/sasa/ryokoki/index.html" name="旅行記">
    旅先での写真や駄文を.
  </content>

  <content href="hyoryuki/index.html" name="漂流記">
    システム開発への私見です.
  </content>

  <content href="biboroku/index.html" name="備忘録">
    教えてもらったことやできたことを忘れないうちに.
  </content>

  <content href="zatsuroku/index.html" name="雑録">
    その他雑多なものが色々.
  </content>

  <content href="links/index.html" name="リンク">
    友人・知合い,便利なソフトウェア,参考になるサイト等.
  </content>

  <content>
    「眠る猫の頁」にリンクを張りたい方は<a href="about.html">リンクについて</a>へ.
  </content>

  <ancher href="http://www.nakka.com/wwwc/">
    <banner src="http://www.nakka.com/wwwc/wwwc_meta.png" alt="WWWC META Check"/>
  </ancher>
  <ancher href="http://validator.w3.org/check?uri=http://www.dab.hi-ho.ne.jp/sasa/">
    <banner src="links/banner/valid-xhtml11.png" alt="Valid XHTML 1.1"/>
  </ancher>
  <ancher href="http://jigsaw.w3.org/css-validator/validator?uri=http://www.dab.hi-ho.ne.jp/sasa/">
    <banner src="links/banner/vcss.png" alt="Valid CSS" />
  </ancher>
  <ancher href="http://www.anybrowser.org/campaign/anybrowser_jp.html">
    <banner src="links/banner/biga.gif" alt="ブラウザを制限しません"/>
  </ancher>
  <ancher href="http://feedvalidator.org/check?url=http://www.dab.hi-ho.ne.jp/sasa/rss/whatsnew.rdf">
    <banner src="links/banner/valid-rss.png" alt="Valid RSS"/>
  </ancher>
</root>