XSLT Transform for Gnucash XML file
Matthew Vanecek
mevanecek at yahoo.com
Fri Sep 5 02:14:41 CDT 2003
I've written a simple XSLT transformation for the Gnucash XML file. It
spits out an HTML file with a 4-column table, "Account Name", "Date
Entered", "Number", "Descriptions", "Value". The "Value" column values
are preceded by an '='. This makes it easy to import into OOo Calc, due
to the way values are stored in our XML file.
To use:
1) Install saxon or xalan, if you don't have it. Or any other XML->XSLT
processor, for that matter (e.g., msxsl on Windows).
2) Copy your Gnucash data file to <file>.xml somewhere. DO NOT WORK ON
YOUR ORIGINAL FILE!!
3) In the <file>.xml, near the top, change <gnc:v2> to the text in
SECTION A below. Save the file.
4) Run <file>.xml and the attached XSLT through the XSLT processor of
your choice. I use saxan, e.g.:
saxon -o finances.html finances.xml finances.xsl
5) Open the HTML in your browser for inspection, or in OpenOffice Calc
for editing.
I've limited the date range to date-entered in the year 2003. You can
change that in the XSLT file.
This stylesheet is more a reference than anything. It groups all the
data by Account, not by transaction. That's easy enough to change, if
you muck about with the for-each loops. Once you see how it works, it's
possible to go in and rearrange stuff differently. Just don't use your
main data file! Always use a copy to muck with.
Enjoy,
--
Matthew Vanecek
perl -e 'print $i=pack(c5,(41*2),sqrt(7056),(unpack(c,H)-2),oct(115),10);'
********************************************************************************
For 93 million miles, there is nothing between the sun and my shadow except me.
I'm always getting in the way of something...
//----------------SECTION A BEGIN-------------------------
<gnc-v2 xmlns:cd="http://www.gnucash.org/XML/cd"
xmlns:book="http://www.gnucash.org/XML/book"
xmlns:gnc="http://www.gnucash.org/XML/gnc"
xmlns:cmdty="http://www.gnucash.org/XML/cmdty"
xmlns:trn="http://www.gnucash.org/XML/trn"
xmlns:split="http://www.gnucash.org/XML/split"
xmlns:act="http://www.gnucash.org/XML/act"
xmlns:price="http://www.gnucash.org/XML/price"
xmlns:ts="http://www.gnucash.org/XML/ts"
xmlns:slot="http://www.gnucash.org/XML/kvpslot"
xmlns:cust="http://www.gnucash.org/XML/cust"
xmlns:addr="http://www.gnucash.org/XML/custaddr">
//----------------SECTION A END-------------------------
-------------- next part --------------
<?xml version="1.0"?>
<!--
Copyright (C) 2003 Matt Vanecek
License is hereby granted to freely copy, modify, or distribute
this work under the terms of the GNU General Public License,
as found at http://www.gnu.org/licenses/gpl.html.
-->
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
xmlns:gnc="http://www.gnucash.org/XML/gnc"
xmlns:cmdty="http://www.gnucash.org/XML/cmdty"
xmlns:price="http://www.gnucash.org/XML/price"
xmlns:act="http://www.gnucash.org/XML/act"
xmlns:trn="http://www.gnucash.org/XML/trn"
xmlns:split="http://www.gnucash.org/XML/split"
xmlns:ts="http://www.gnucash.org/XML/ts"
xmlns:cust="http://www.gnucash.org/XML/cust">
<xsl:output method="html" indent="yes" encoding="ISO-8859-1"/>
<xsl:template match="gnc-v2/gnc:book">
<html>
<head><title>Finances File</title></head>
<body>
<table border="1">
<th>Account Name</th>
<th>Date Entered</th>
<th>Number</th>
<th>Descriptions</th>
<th>Value</th>
<xsl:for-each select="gnc:account">
<xsl:sort select="act:name"/>
<xsl:variable name="accountid">
<xsl:value-of select="act:id"/>
</xsl:variable>
<xsl:variable name="actname">
<xsl:value-of select="act:name"/>
</xsl:variable>
<xsl:for-each select="../gnc:transaction">
<xsl:sort select="trn:date-entered/ts:date"/>
<xsl:sort select="trn:num"/>
<!-- Change 2003 to a different year, or even to a year-mo
form (e.g., 2003-06) to get different sets of transactions -->
<xsl:if test="starts-with(trn:date-entered/ts:date, '2003') and
$accountid = trn:splits/trn:split/split:account">
<tr>
<td><xsl:value-of select="$actname"/></td>
<td><xsl:value-of select="trn:date-entered/ts:date"/></td>
<td><xsl:value-of select="trn:num"/></td>
<td><xsl:value-of select="trn:description"/></td>
<td>=<xsl:value-of select="trn:splits/trn:split/split:value"/></td>
</tr>
</xsl:if>
</xsl:for-each>
</xsl:for-each>
</table>
<HR size="5"/>
</body>
</html>
</xsl:template>
<!-- Root template - weed out the stuff we don't want -->
<xsl:template match="text() | @*">
</xsl:template>
</xsl:stylesheet>
More information about the gnucash-devel
mailing list