Skip to content

Instantly share code, notes, and snippets.

@ayweak
Last active August 29, 2015 13:56
Show Gist options
  • Save ayweak/9004923 to your computer and use it in GitHub Desktop.
Save ayweak/9004923 to your computer and use it in GitHub Desktop.
svn log の xml フォーマットをプレーンテキストフォーマット(擬似)に変換する。
xquery version "1.0" encoding "UTF-8";
(: java -cp saxon9he.jar net.sf.saxon.Query -q:svn_log_xml2txt.xq -s:source.xml :)
declare namespace saxon="http://saxon.sf.net/";
declare option saxon:output "method=text";
declare variable $sep-string :=
"------------------------------------------------------------------------";
declare variable $nl := "
";
string-join(
(
$sep-string,
for $logentry in //logentry
let $revision := concat("r", $logentry/@revision)
let $author := $logentry/author
let $date := $logentry/date
let $msg := $logentry/msg
let $msg-line-count :=
let $count := count(tokenize($msg, $nl))
return concat($count, " line", if ($count gt 1) then "s" else "")
let $path-lines :=
for $path in $logentry/paths/path
return concat(" ", $path/@action, " ", $path)
return string-join(
(
string-join(($revision, $author, $date, $msg-line-count), " | "),
"",
$path-lines,
"",
$msg,
$sep-string
),
$nl
),
""
),
$nl
)
<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet
version="1.0"
xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output method="text"/>
<xsl:variable
name="SEP_STRING"
select="'------------------------------------------------------------------------'"/>
<xsl:template match="/">
<xsl:apply-templates select="log/logentry"/>
<xsl:value-of select="$SEP_STRING"/>
<xsl:text>&#x0A;</xsl:text>
</xsl:template>
<xsl:template match="logentry">
<xsl:value-of select="$SEP_STRING"/>
<xsl:text>&#x0A;</xsl:text>
<xsl:text>r</xsl:text>
<xsl:value-of select="@revision"/>
<xsl:text> | </xsl:text>
<xsl:value-of select="author"/>
<xsl:text> | </xsl:text>
<xsl:value-of select="date"/>
<xsl:text> | </xsl:text>
<xsl:variable name="count">
<xsl:call-template name="count-lines">
<xsl:with-param name="text" select="msg"/>
</xsl:call-template>
</xsl:variable>
<xsl:value-of select="$count"/>
<xsl:text> line</xsl:text>
<xsl:if test="$count &gt; 1">
<xsl:text>s</xsl:text>
</xsl:if>
<xsl:text>&#x0A;</xsl:text>
<!-- 空行を出力 -->
<xsl:text>&#x0A;</xsl:text>
<xsl:apply-templates select="paths/path"/>
<!-- 空行を出力 -->
<xsl:text>&#x0A;</xsl:text>
<xsl:value-of select="msg"/>
<xsl:text>&#x0A;</xsl:text>
</xsl:template>
<xsl:template name="count-lines">
<xsl:param name="text"/>
<xsl:param name="count" select="1"/>
<xsl:variable name="result">
<xsl:choose>
<xsl:when test="contains($text, '&#x0A;')">
<xsl:call-template name="count-lines">
<xsl:with-param name="text" select="substring-after($text, '&#x0A;')"/>
<xsl:with-param name="count" select="$count + 1"/>
</xsl:call-template>
</xsl:when>
<xsl:otherwise>
<xsl:value-of select="$count"/>
</xsl:otherwise>
</xsl:choose>
</xsl:variable>
<xsl:value-of select="$result"/>
</xsl:template>
<xsl:template match="path">
<xsl:text> </xsl:text>
<xsl:value-of select="@action"/>
<xsl:text> </xsl:text>
<xsl:value-of select="."/>
<xsl:text>&#x0A;</xsl:text>
</xsl:template>
</xsl:stylesheet>
<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet
version="2.0"
xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
xmlns:xs="http://www.w3.org/2001/XMLSchema">
<xsl:output method="text"/>
<xsl:param name="TIMEZONE_OFFSET" select="'PT9H'"/>
<xsl:variable
name="SEP_STRING"
select="'------------------------------------------------------------------------'"/>
<xsl:template match="/">
<xsl:apply-templates select="log/logentry"/>
<xsl:value-of select="$SEP_STRING"/>
<xsl:text>&#x0A;</xsl:text>
</xsl:template>
<xsl:template match="logentry">
<xsl:value-of select="$SEP_STRING"/>
<xsl:text>&#x0A;</xsl:text>
<xsl:text>r</xsl:text>
<xsl:value-of select="@revision"/>
<xsl:text> | </xsl:text>
<xsl:value-of select="author"/>
<xsl:text> | </xsl:text>
<!-- e.g. "2012-02-29 21:36:10 +0900 (Wed, 29 Feb 2012)" -->
<xsl:variable
name="dt"
select="adjust-dateTime-to-timezone(xs:dateTime(date), xs:dayTimeDuration($TIMEZONE_OFFSET))"/>
<xsl:value-of select="format-dateTime($dt, '[Y0001]-[M01]-[D01] [H01]:[m01]:[s01]')"/>
<xsl:value-of select="replace(format-dateTime($dt, ' [Z] '), ':', '')"/>
<xsl:value-of select="format-dateTime($dt, '([F,*-3], [D01] [MNn,*-3] [Y0001])', 'en', (), 'us')"/>
<xsl:text> | </xsl:text>
<xsl:variable name="count" select="count(tokenize(msg, '&#x0A;'))"/>
<xsl:value-of select="$count"/>
<xsl:text> line</xsl:text>
<xsl:if test="$count &gt; 1">
<xsl:text>s</xsl:text>
</xsl:if>
<xsl:text>&#x0A;</xsl:text>
<!-- 空行を出力 -->
<xsl:text>&#x0A;</xsl:text>
<xsl:apply-templates select="paths/path"/>
<!-- 空行を出力 -->
<xsl:text>&#x0A;</xsl:text>
<xsl:value-of select="msg"/>
<xsl:text>&#x0A;</xsl:text>
</xsl:template>
<xsl:template match="path">
<xsl:text> </xsl:text>
<xsl:value-of select="@action"/>
<xsl:text> </xsl:text>
<xsl:value-of select="."/>
<xsl:text>&#x0A;</xsl:text>
</xsl:template>
</xsl:stylesheet>
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment