朝顔日記

RSS と見出し一覧の生成

2004-04-06

手作業で、この日記の RSS やら 見出し一覧やらを作るのはダルいので、またなんとかコンピタにやってもらうことにします。

以前は、神崎さんとこで配布されている perl スクリプト を改造して RSS を生成していたのですが、見出しアンカーをやめたために、このスクリプトを改造するのはかなり大変なので、xslt を使って生成することにしました。捏造した xslt は以下のとおり。

<?xml version="1.0" encoding="utf-8" ?>
<xsl:stylesheet version="1.0"
  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:x="http://www.w3.org/1999/xhtml"
  exclude-result-prefixes="x" >
  <xsl:output method="xml" version="1.0" encoding="utf-8"
    media-type="application/xhtml+xml"
    indent="yes"
    omit-xml-declaration="no"/>
  <xsl:template match="/">
    <xsl:processing-instruction name="xml-stylesheet">type="text/xsl" href="rss2html.xsl"</xsl:processing-instruction>
    <xsl:call-template name="channel"/>
  </xsl:template>
  <xsl:template name="channel">
    <rdf:RDF
      xmlns="http://purl.org/rss/1.0/"
      xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
      xml:lang="ja">
      <channel rdf:about="http://diary.noasobi.net/rss.rdf">
        <title>朝顔日記</title>
        <link>http://diary.noasobi.net/</link>
        <description>のりの日々のあれこれを綴った朝顔日記の最近の記事の一覧</description>
        <image rdf:resource="http://diary.noasobi.net/img/asagao-p.png"/>
        <xsl:call-template name="items"/>
      </channel>
      <xsl:call-template name="item"/>
    </rdf:RDF>
  </xsl:template>
  <xsl:template name="items">
    <items>
      <rdf:Seq>
        <xsl:for-each select="x:html/x:body/x:div/x:div/x:div/x:p[attribute::class='topic-info']/x:a">
          <rdf:li rdf:resource="{.}"/>
        </xsl:for-each>
      </rdf:Seq>
    </items>
  </xsl:template>
  <xsl:template name="item">
    <xsl:for-each select="x:html/x:body/x:div/x:div/x:div[attribute::class='section']">
      <item rdf:about="{x:p[attribute::class='topic-info']/x:a}">
        <title><xsl:value-of select="x:h3"/></title>
        <link><xsl:value-of select="x:p[attribute::class='topic-info']/x:a"/></link>
        <description><xsl:value-of select="x:p"/></description>
      </item>
    </xsl:for-each>
  </xsl:template>
</xsl:stylesheet>

xslt プロセッサは msxslで、msxsl -xe latest.html html2rss.xsl > rss.rdf のようにしてコマンドプロンプトで使用します。

見出し一覧の生成も、前は自作しょぼしょぼ perl スクリプトで作っていたのですが、これも見出しアンカーでなくなったので使えず、xslt で生成するようにしました。以下、月別のまとめファイルに適用する heading.xsl です。

<?xml version="1.0"?>
<xsl:stylesheet version="1.0"
  xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
  xmlns="http://www.w3.org/1999/xhtml"
  xmlns:x="http://www.w3.org/1999/xhtml"
  exclude-result-prefixes="x" >
  <xsl:output method="xml" version="1.0" encoding="Shift_JIS"
    media-type="html"
    indent="yes"
    omit-xml-declaration="yes"/>
  <xsl:template match="/">
    <ul>
      <xsl:apply-templates select="x:html/x:body/x:div/x:div/x:div[attribute::class='section']"/>
    </ul>
  </xsl:template>
  <xsl:template match="x:html/x:body/x:div/x:div/x:div[attribute::class='section']">
      <li class="{x:h3/@class}"><xsl:value-of select="preceding::x:h2[position()=1]"/><a href="{x:p[attribute::class='topic-info']/x:a/@href}"><xsl:value-of select="x:h3"/></a></li>
  </xsl:template>
</xsl:stylesheet>

これで、これまでのややこしシステム(何)の復活です。しかし、日記書き用の xyzzy の 定型句挿入 lisp を書き換えなくては、やっぱり面倒でやっていられない。ここが一番苦手です。xslt も苦手なんですが。:p)

「RSS と見出し一覧の生成」へコメントをつける

書き込み時の挙動について
URI らしき文字列には自動的にリンクが張られます。また "<" や、">" は実体参照化されます。
スパム対策のため、リファラを切っていると投稿できません。

この記事の永続的 URI ならびに トラックバック ping URI
http://diary.noasobi.net/2004/04/diary_040406a.html