Merge pull request #284 from afh/pull/iso4217

Add script to generate commodities from ISO 4217

Interesting.  Thanks
This commit is contained in:
Craig Earls 2014-05-08 06:08:17 -07:00
commit 55ecb9fb62
2 changed files with 192 additions and 0 deletions

View file

@ -0,0 +1,54 @@
#!/bin/sh
# iso4217ledger.sh - Convert ISO 4217 currencies to ledger commodities
#
# This script will download the latest XML for ISO 4217 Table A.1
# and print the contained currency & funds code list as ledger
# commodity definitions to stdout.
# Copyright (c) 2014 Alexis Hildebrandt
#
# Permission is hereby granted, free of charge, to any person obtaining a copy
# of this software and associated documentation files (the "Software"), to deal
# in the Software without restriction, including without limitation the rights
# to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
# copies of the Software, and to permit persons to whom the Software is
# furnished to do so, subject to the following conditions:
#
# The above copyright notice and this permission notice shall be included in
# all copies or substantial portions of the Software.
#
# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
# IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
# FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
# AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
# LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
# OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
# SOFTWARE.
xml_url="http://www.currency-iso.org/dam/downloads/table_a1.xml"
xsl_file="$(dirname $0)/iso4217ledger.xsl"
xsltproc="$(which xsltproc)"
if [ ! -f "$xsltproc" -o ! -x "$xsltproc" ]; then
echo "Can't find xsltproc"
exit 1
fi
download_command="$(which curl)"
if [ -f "$download_command" \
-a -x "$download_command" ]; then
download_options="--silent"
else
download_command="$(which wget)"
if [ -n "$download_command" \
-a -f "$download_command" \
-a -x "$download_command" ]; then
download_options="--quiet --output-document -"
else
echo "Can't find curl or wget."
exit 1
fi
fi
$download_command $download_options "$xml_url" | $xsltproc "$xsl_file" -

View file

@ -0,0 +1,138 @@
<?xml version="1.0" encoding="UTF-8"?>
<!--
! iso4217ledger.xsl - Transform ISO 4217 Table A.1 to ledger commodities
!
! The current currency & funds code list is found at:
! http://www.currency-iso.org/en/home/tables/table-a1.html
! -->
<!--
! Copyright (c) 2014 Alexis Hildebrandt
!
! Permission is hereby granted, free of charge, to any person obtaining a copy
! of this software and associated documentation files (the "Software"), to deal
! in the Software without restriction, including without limitation the rights
! to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
! copies of the Software, and to permit persons to whom the Software is
! furnished to do so, subject to the following conditions:
!
! The above copyright notice and this permission notice shall be included in
! all copies or substantial portions of the Software.
!
! THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
! IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
! FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
! AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
! LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
! OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
! SOFTWARE.
! -->
<xsl:stylesheet version="1.0"
xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
>
<!--
! Set the value of this variable to your preferred decimal separator.
! For European countries this is likely to be the comma ','.
! -->
<xsl:variable name="decimal_separator">
<xsl:text>,</xsl:text>
<!--
<xsl:text>.</xsl:text>
-->
</xsl:variable>
<!--
! Ensure that plain text will be written,
! and all whitespace from the XML source is stripped.
! -->
<xsl:output method="text"/>
<xsl:template match="text()" />
<!--
! Add comment that the file was generated.
! -->
<xsl:template match="/">
<xsl:text>; Ledger commodity declarations
; Generated from ISO 4217 Table A.1 XML (</xsl:text>
<xsl:value-of select="ISO_4217/@Pblshd"/>
<xsl:text>) using iso4217ledger.xsl
</xsl:text>
<xsl:apply-templates />
</xsl:template>
<!--
! Create ledger entry for the corresponding commodity
! -->
<xsl:template match="CcyNtry">
<xsl:variable name="ccy">
<xsl:choose>
<xsl:when test="Ccy">
<xsl:value-of select="Ccy"/>
</xsl:when>
<xsl:otherwise>
<xsl:text>¤</xsl:text>
</xsl:otherwise>
</xsl:choose>
</xsl:variable>
<xsl:text>commodity </xsl:text>
<xsl:value-of select="$ccy"/>
<xsl:text>
note </xsl:text>
<xsl:value-of select="CcyNm"/>
<xsl:text> - </xsl:text>
<xsl:value-of select="normalize-space(CtryNm)"/>
<xsl:if test="CcyNbr">
<xsl:text> (</xsl:text>
<xsl:value-of select="CcyNbr"/>
<xsl:text>)</xsl:text>
</xsl:if>
<xsl:text>
format </xsl:text>
<xsl:value-of select="$ccy"/><xsl:text> </xsl:text>
<xsl:text>0000</xsl:text>
<xsl:choose>
<xsl:when test="CcyMnrUnts > 0">
<xsl:value-of select="$decimal_separator"/>
<xsl:call-template name="zero">
<xsl:with-param name="count" select="CcyMnrUnts"/>
</xsl:call-template>
</xsl:when>
<xsl:when test="CcyMnrUnts = 'N.A.'">
<xsl:value-of select="$decimal_separator"/>
<xsl:call-template name="zero">
<xsl:with-param name="count" select="3"/>
</xsl:call-template>
</xsl:when>
<xsl:otherwise>
</xsl:otherwise>
</xsl:choose>
<xsl:text>
nomarket
</xsl:text>
</xsl:template>
<!--
! Recursive template to generate 0s
! -->
<xsl:template name="zero">
<xsl:param name="count" select="0"/>
<xsl:if test="$count > 0">
<xsl:text>0</xsl:text>
<xsl:call-template name="zero">
<xsl:with-param name="count" select="$count - 1"/>
</xsl:call-template>
</xsl:if>
</xsl:template>
</xsl:stylesheet>