[SVN][JScript] SVNのログからRSSを作成 for Windows
会社でSVNのログをRSSで配信したくなったのだが、Windows環境でしっくりくるものがなかったので、MSXML + JScript + XSLTで自作。svnが吐くxmlをxsltでrssに変換する。
例によって車輪の再発明だけど気にしない。XSLTが少しだけ理解できた。
自宅にはWindowsのSVN環境はないので明日会社で試してみる。
// 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>