diff options
author | Miika Turkia <miika.turkia@gmail.com> | 2014-01-16 22:50:13 +0200 |
---|---|---|
committer | Dirk Hohndel <dirk@hohndel.org> | 2014-01-17 05:57:37 +0700 |
commit | 209a793acf69d470c660f482b64266f7b5875549 (patch) | |
tree | a0e8dc9ef8892fcf1e5fad1c3bba14f0dc1676c3 /xslt/sensuscsv.xslt | |
parent | 6e9f32604b0500976326b6f66490fd6a652fc6c5 (diff) | |
download | subsurface-209a793acf69d470c660f482b64266f7b5875549.tar.gz |
XSLT for parsing Sensus Ultra CSV export
Sensus divides temperature in one or two fields (depending on locale),
so it cannot be parsed with our generic CSV import XSLT. And e.g. depth
is in millimeters.
This supports only importing of single dive at a time. Multiple dives
would be in same file with first column being dive number.
Signed-off-by: Miika Turkia <miika.turkia@gmail.com>
Signed-off-by: Dirk Hohndel <dirk@hohndel.org>
Diffstat (limited to 'xslt/sensuscsv.xslt')
-rw-r--r-- | xslt/sensuscsv.xslt | 200 |
1 files changed, 200 insertions, 0 deletions
diff --git a/xslt/sensuscsv.xslt b/xslt/sensuscsv.xslt new file mode 100644 index 000000000..f94eb7374 --- /dev/null +++ b/xslt/sensuscsv.xslt @@ -0,0 +1,200 @@ +<?xml version="1.0"?> +<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="1.0"> + <xsl:include href="commonTemplates.xsl"/> + <xsl:strip-space elements="*"/> + <xsl:param name="separatorIndex" select="separatorIndex"/> + <xsl:output method="xml" indent="yes"/> + + <xsl:variable name="lf"><xsl:text> +</xsl:text></xsl:variable> + <xsl:variable name="fs"> + <xsl:choose> + <xsl:when test="$separatorIndex = 0"><xsl:text> </xsl:text></xsl:when> + <xsl:when test="$separatorIndex = 2"><xsl:text>;</xsl:text></xsl:when> + <xsl:otherwise><xsl:text>,</xsl:text></xsl:otherwise> + </xsl:choose> + </xsl:variable> + <xsl:variable name="timeField" select="9"/> + <xsl:variable name="depthField" select="10"/> + <xsl:variable name="tempField" select="11"/> + + <xsl:template match="/"> + <divelog program="subsurface-import" version="2"> + <dives> + <dive> + <xsl:variable name="line"> + <xsl:value-of select="substring-before(substring-after(//SensusCSV, $lf), $lf)"/> + </xsl:variable> + + <xsl:variable name="year"> + <xsl:call-template name="getFieldByIndex"> + <xsl:with-param name="index" select="3"/> + <xsl:with-param name="line" select="$line"/> + </xsl:call-template> + </xsl:variable> + <xsl:variable name="month"> + <xsl:call-template name="getFieldByIndex"> + <xsl:with-param name="index" select="4"/> + <xsl:with-param name="line" select="$line"/> + </xsl:call-template> + </xsl:variable> + <xsl:variable name="day"> + <xsl:call-template name="getFieldByIndex"> + <xsl:with-param name="index" select="5"/> + <xsl:with-param name="line" select="$line"/> + </xsl:call-template> + </xsl:variable> + <xsl:variable name="hours"> + <xsl:call-template name="getFieldByIndex"> + <xsl:with-param name="index" select="6"/> + <xsl:with-param name="line" select="$line"/> + </xsl:call-template> + </xsl:variable> + <xsl:variable name="seconds"> + <xsl:call-template name="getFieldByIndex"> + <xsl:with-param name="index" select="7"/> + <xsl:with-param name="line" select="$line"/> + </xsl:call-template> + </xsl:variable> + + <xsl:attribute name="date"> + <xsl:value-of select="concat($year, '-', $month, '-', $day)"/> + </xsl:attribute> + <xsl:attribute name="time"> + <xsl:value-of select="concat($hours, ':', $seconds)"/> + </xsl:attribute> + + <xsl:attribute name="number"> + <xsl:call-template name="getFieldByIndex"> + <xsl:with-param name="index" select="0"/> + <xsl:with-param name="line" select="$line"/> + </xsl:call-template> + </xsl:attribute> + + <divecomputerid deviceid="ffffffff" model="SensusCSV" /> + <xsl:call-template name="printLine"> + <xsl:with-param name="line" select="substring-before(//SensusCSV, $lf)"/> + <xsl:with-param name="remaining" select="substring-after(//SensusCSV, $lf)"/> + </xsl:call-template> + </dive> + </dives> + </divelog> + </xsl:template> + + <xsl:template name="printLine"> + <xsl:param name="line"/> + <xsl:param name="remaining"/> + + <!-- We only want to process lines with different time stamps, and + timeField is not necessarily the first field --> + <xsl:if test="$line != substring-before($remaining, $lf)"> + <xsl:variable name="curTime"> + <xsl:call-template name="getFieldByIndex"> + <xsl:with-param name="index" select="$timeField"/> + <xsl:with-param name="line" select="$line"/> + </xsl:call-template> + </xsl:variable> + <xsl:variable name="prevTime"> + <xsl:call-template name="getFieldByIndex"> + <xsl:with-param name="index" select="$timeField"/> + <xsl:with-param name="line" select="substring-before($remaining, $lf)"/> + </xsl:call-template> + </xsl:variable> + + <xsl:if test="$curTime >= 0 and $curTime != $prevTime"> + <xsl:call-template name="printFields"> + <xsl:with-param name="line" select="$line"/> + </xsl:call-template> + </xsl:if> + </xsl:if> + <xsl:if test="$remaining != ''"> + <xsl:call-template name="printLine"> + <xsl:with-param name="line" select="substring-before($remaining, $lf)"/> + <xsl:with-param name="remaining" select="substring-after($remaining, $lf)"/> + </xsl:call-template> + </xsl:if> + </xsl:template> + + <xsl:template name="printFields"> + <xsl:param name="line"/> + + <xsl:variable name="value"> + <xsl:call-template name="getFieldByIndex"> + <xsl:with-param name="index" select="$timeField"/> + <xsl:with-param name="line" select="$line"/> + </xsl:call-template> + </xsl:variable> + + <sample> + <xsl:attribute name="time"> + + <xsl:call-template name="sec2time"> + <xsl:with-param name="timeSec"> + <xsl:value-of select="$value"/> + </xsl:with-param> + </xsl:call-template> + </xsl:attribute> + + <xsl:variable name="depth"> + <xsl:call-template name="getFieldByIndex"> + <xsl:with-param name="index" select="$depthField"/> + <xsl:with-param name="line" select="$line"/> + </xsl:call-template> + </xsl:variable> + <xsl:attribute name="depth"> + <xsl:value-of select="$depth div 1000"/> + </xsl:attribute> + + <xsl:variable name="temp"> + <xsl:call-template name="getFieldByIndex"> + <xsl:with-param name="index" select="$tempField"/> + <xsl:with-param name="line" select="$line"/> + </xsl:call-template> + </xsl:variable> + <xsl:variable name="tempDec"> + <xsl:call-template name="getFieldByIndex"> + <xsl:with-param name="index" select="$tempField + 1"/> + <xsl:with-param name="line" select="$line"/> + </xsl:call-template> + </xsl:variable> + + <xsl:variable name="temperature"> + <xsl:choose> + <xsl:when test="$tempDec != ''"> + <xsl:value-of select="concat($temp, '.', $tempDec)"/> + </xsl:when> + <xsl:otherwise> + <xsl:value-of select="$temp"/> + </xsl:otherwise> + </xsl:choose> + </xsl:variable> + <xsl:attribute name="temp"> + <xsl:value-of select="concat(format-number($temperature - 273.15, '0.00'), ' C')"/> + </xsl:attribute> + + </sample> + </xsl:template> + + <xsl:template name="getFieldByIndex"> + <xsl:param name="index"/> + <xsl:param name="line"/> + <xsl:choose> + <xsl:when test="$index > 0"> + <xsl:call-template name="getFieldByIndex"> + <xsl:with-param name="index" select="$index -1"/> + <xsl:with-param name="line" select="substring-after($line, $fs)"/> + </xsl:call-template> + </xsl:when> + <xsl:otherwise> + <xsl:choose> + <xsl:when test="substring-before($line,$fs) != ''"> + <xsl:value-of select="substring-before($line,$fs)"/> + </xsl:when> + <xsl:otherwise> + <xsl:value-of select="$line"/> + </xsl:otherwise> + </xsl:choose> + </xsl:otherwise> + </xsl:choose> + </xsl:template> +</xsl:stylesheet> |