朝顔日記

ややこし更新システム

2003-11-23

ようやく、コピペしないで済むややこし更新システムができますた!

基本方針は、以前やりたいことで書いたようにコピペはしたくないし、最新版と保存版では現状と同じように記事の並び順を逆にしたいし、かつ、月初めでも、最新版の記事の数を一定数にしたいというもの。

そのためには、コピペは面倒で書いたように先月分と今月分の日記を連結して、それを逆順にソートしてそれから何日か分を抜き出すという作戦(?)を立てて、それをするための XSLT を作ってみました。以下、先月分と今月分を連結する renketu.xsl です。


<?xml version="1.0" encoding="Shift_JIS"?>
<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"
omit-xml-declaration="no"/>
<xsl:template match="/">
<html>
<head>
<title>先月分と今月分</title>
</head>
<body>
<xsl:copy-of select="x:html/x:body/x:div/x:div" />
<xsl:copy-of select="document('0311.html')/x:html/x:body/x:div/x:div" />
</body>
</html>
</xsl:template>
</xsl:stylesheet>

この XSLT で出来たファイルを逆順に並べ替えるのが、sort.xsl


 <xsl:template match="/">
  <html>
   <head>
    <title>日付でソート</title>
   </head>
   <body>
    <xsl:apply-templates/>
   </body>
  </html>
 </xsl:template>
 <xsl:template match="x:html/x:body">
  <xsl:for-each select="x:div">
   <xsl:sort select="@id" order="descending"/>
   <div class="section" id="{@id}">
    <h2><a href="{x:h2/x:a/@href}"><xsl:value-of select="x:h2/x:a"/></a></h2>
    <xsl:apply-templates select="."/>
   </div>
  </xsl:for-each>
 </xsl:template>
 <xsl:template match="x:html/x:body/x:div">
  <xsl:for-each select="x:div">
   <xsl:sort select="@id" order="descending"/>
   <xsl:copy-of select="."/>
  </xsl:for-each>
 </xsl:template>

んで、並べ替えたものから、最新4日分を抜き出すのが、latest.xslで、これでいろいろ必要な部分を付け足しているんですが、肝心な部分はこんな感じ


<div class="content diary">
 <h1>いまだ似非Blog(何)</h1>
 <p id="start">これより本文</p>
 <xsl:variable name="first" select="1"></xsl:variable>
 <xsl:copy-of select="x:html/x:body/x:div[$first]"/>
 <xsl:variable name="second" select="2"></xsl:variable>
 <xsl:copy-of select="x:html/x:body/x:div[$second]"/>
 <xsl:variable name="third" select="3"></xsl:variable>
 <xsl:copy-of select="x:html/x:body/x:div[$third]"/>
 <xsl:variable name="fourth" select="4"></xsl:variable>
 <xsl:copy-of select="x:html/x:body/x:div[$fourth]"/>
</div>

で、これらを実行するためのバッチファイルが、renketu.bat


@echo off
Msxsl -xe 0310.html renketu.xsl > renketu.htm
Msxsl renketu.htm sort.xsl > sort.htm
Msxsl sort.htm latest.xsl > latest.html

最初の行で msxsl.exe を-xe オプション付きで起動しているのは、xhtml1.1を msxsl.exe に読ませると処理できない問題を回避するためと dtd 読まないので処理が早いから。

参考
MSXML で XHTML ファイルを読み込む際の注意点
Xalan-Java の DTD 取得行程にイライラ

これで、今月分のファイルに記事を書き、その後 renketu.bat を実行すれば、数秒のちには latest.html が生成され、とりあえずコピペはしなくないという目的は達成されたはずです。多分。:p)

が、ややこし更新システムは、まだ終わらない。(謎)

sort.xslを修正しました。2003-11-24

「ややこし更新システム」へコメントをつける

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

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