[SVN][JScript] SVNのログからRSSを作成 for Windows

会社でSVNのログをRSSで配信したくなったのだが、Windows環境でしっくりくるものがなかったので、MSXML + JScript + XSLTで自作。svnが吐くxmlxsltrssに変換する。
例によって車輪の再発明だけど気にしない。XSLTが少しだけ理解できた。
自宅にはWindowsSVN環境はないので明日会社で試してみる。

// xsltProc.js
import System;
import System.IO;

var args = Environment.GetCommandLineArgs();
if(args.length < 3)
{
	Console.Error.WriteLine("usage: xsltProc <xml file> <xslt file>");
	Environment.Exit(1);
}

var objDoc = new ActiveXObject("Msxml2.DOMDocument.3.0");
var objStl = new ActiveXObject("Msxml2.DOMDocument.3.0");

// xml file読み込み.
objDoc.load(args[1]);
if (objDoc.parseError.errorCode != 0) {
	var myErr = objDoc.parseError;
	Console.Error.WriteLine("You have error " + myErr.reason);
	Environment.Exit(1);
}

// xslt file読み込み.
objSlt.load(args[2]);
if (objSlt.parseError.errorCode != 0) {
	var myErr = objSlt.parseError;
	Console.Error.WriteLine("You have error " + myErr.reason);
	Environment.Exit(1);
}

// xmlにxsltを適用.
var strXml = objDoc.transformNode(objSlt); // XSLTransform

var strCharCode = objStl.getElementsByTagName("xsl:output").item(0).getAttribute("encoding");
strXml = strXml.replace("UTF-16",strCharCode);

// 上書きモードでファイルストリームを開く.
//var objSW = new StreamWriter("svn.rdf", false);
//objSW.Write(strXml);
//objSW.Close();

print(strXml);
> jsc xsltProc.js

でxsltProc.exeができる(要VS2005?)。


XSLTはこちら。まだまだ改良の余地がありそう。

<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet version="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/"
	xmlns="http://purl.org/rss/1.0/">
<xsl:output method="xml" indent="yes" encoding="UTF-8"/>
	<xsl:template match="/">
		<rdf:RDF 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/" xmlns="http://purl.org/rss/1.0/">
			<channel rdf:about="">
				<title>TITLE</title>
				<description>..</description>
				<dc:language>ja</dc:language>
				<dc:date></dc:date>
			</channel>
			<xsl:apply-templates />
		</rdf:RDF>
	</xsl:template>

	<xsl:template match="log">
		<xsl:apply-templates />
	</xsl:template>
	
	<xsl:template match="logentry">
		<item>
			<title><xsl:value-of select="./msg"/></title>
			<description>revision:<xsl:value-of select="./@revision"/><br/><xsl:value-of select="./msg"/></description>
			<dc:date><xsl:value-of select="./date"/></dc:date>
			<dc:author><xsl:value-of select="./author"/></dc:author>
		</item>
	</xsl:template>
</xsl:stylesheet>