diff options
author | Miika Turkia <miika.turkia@gmail.com> | 2013-02-06 21:31:40 +0200 |
---|---|---|
committer | Dirk Hohndel <dirk@hohndel.org> | 2013-02-07 07:06:49 +1100 |
commit | b9a19813eaa104748b3adafc1174b7c4fa0fd10e (patch) | |
tree | c27bdeeb31fbc5ee985461ad7bd54593f4e09aba | |
parent | 50170e0cf3ed22b7a1eca5426c9c5f9bd1bbf90d (diff) | |
download | subsurface-b9a19813eaa104748b3adafc1174b7c4fa0fd10e.tar.gz |
Import MacDive divelogs
This XSLT converts MacDive logs into Subsurface format. It supports both
the current version and the upcoming version of the log format.
Conversion was not tested with Imperial units as no samples were
available of such logs. Thus functionality with Imperial units is not
guaranteed.
Note that the gear inventory is currently discarded.
Signed-off-by: Miika Turkia <miika.turkia@gmail.com>
Signed-off-by: Dirk Hohndel <dirk@hohndel.org>
-rw-r--r-- | parse-xml.c | 1 | ||||
-rw-r--r-- | xslt/MacDive.xslt | 260 |
2 files changed, 261 insertions, 0 deletions
diff --git a/parse-xml.c b/parse-xml.c index 3bf9de9d8..2bc68c6bf 100644 --- a/parse-xml.c +++ b/parse-xml.c @@ -1528,6 +1528,7 @@ static struct xslt_files { } xslt_files[] = { { "SUUNTO", "SuuntoSDM.xslt" }, { "JDiveLog", "jdivelog2subsurface.xslt" }, + { "dives", "MacDive.xslt" }, { NULL, } }; diff --git a/xslt/MacDive.xslt b/xslt/MacDive.xslt new file mode 100644 index 000000000..2ddeb272f --- /dev/null +++ b/xslt/MacDive.xslt @@ -0,0 +1,260 @@ +<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="1.0"> + <xsl:strip-space elements="*"/> + <xsl:output method="xml" indent="yes"/> + + <xsl:template match="/"> + <divelog program='subsurface' version='2'> + <settings> + <divecomputer> + <xsl:apply-templates select="/dives/dive/computer"/> + <xsl:apply-templates select="/dives/dive/serial"/> + </divecomputer> + </settings> + <dives> + <xsl:apply-templates select="/dives/dive"/> + </dives> + </divelog> + </xsl:template> + + <xsl:template match="computer"> + <xsl:attribute name="model"> + <xsl:value-of select="."/> + </xsl:attribute> + </xsl:template> + + <xsl:template match="serial"> + <xsl:attribute name="serial"> + <xsl:value-of select="."/> + </xsl:attribute> + </xsl:template> + + <xsl:template match="dive"> + <xsl:variable name="units" select="/dives/units"/> + <dive> + <xsl:attribute name="number"> + <xsl:choose> + <xsl:when test="divenumber != ''"> + <xsl:value-of select="divenumber"/> + </xsl:when> + <xsl:otherwise> + <xsl:value-of select="diveNumber"/> + </xsl:otherwise> + </xsl:choose> + </xsl:attribute> + + <xsl:attribute name="date"> + <xsl:value-of select="date"/> + </xsl:attribute> + + <xsl:attribute name="duration"> + <xsl:call-template name="timeConvert"> + <xsl:with-param name="timeSec" select="duration"/> + <xsl:with-param name="units" select="$units"/> + </xsl:call-template> + </xsl:attribute> + + <xsl:choose> + <xsl:when test="maxdepth != ''"> + <depth max="{concat(maxdepth,' m')}" mean="{concat(avgdepth, ' m')}"/> + </xsl:when> + <xsl:otherwise> + <!-- Note: averageDepth is mis-spelled as in received sample --> + <depth max="{concat(maxDepth,' m')}" mean="{concat(avergeDepth, ' m')}"/> + </xsl:otherwise> + </xsl:choose> + + <xsl:variable name="delta"> + <xsl:value-of select="sampleInterval"/> + </xsl:variable> + + <location> + <xsl:value-of select="concat(country, ' ', location, ' ', site)"/> + </location> + + <xsl:if test="sitelat != ''"> + <gps> + <xsl:value-of select="concat(sitelat, ' ', sitelon)"/> + </gps> + </xsl:if> + <xsl:if test="siteLat != ''"> + <gps> + <xsl:value-of select="concat(siteLat, ' ', siteLon)"/> + </gps> + </xsl:if> + + <notes> + <xsl:value-of select="notes"/> + </notes> + + <divecomputer> + <xsl:attribute name="model"> + <xsl:value-of select="computer"/> + </xsl:attribute> + </divecomputer> + + <xsl:if test="o2percent != ''"> + <cylinder> + <xsl:attribute name="o2"> + <xsl:value-of select="concat(o2percent, '%')"/> + </xsl:attribute> + </cylinder> + </xsl:if> + + <xsl:for-each select="gases/gas"> + <cylinder> + <xsl:if test="oxygen != ''"> + <xsl:attribute name="o2"> + <xsl:value-of select="concat(oxygen, '%')"/> + </xsl:attribute> + </xsl:if> + <xsl:if test="helium != ''"> + <xsl:attribute name="he"> + <xsl:value-of select="concat(helium, '%')"/> + </xsl:attribute> + </xsl:if> + <xsl:if test="pressureStart != ''"> + <xsl:attribute name="start"> + <xsl:value-of select="concat(pressureStart, ' bar')"/> + </xsl:attribute> + </xsl:if> + <xsl:if test="pressureEnd != ''"> + <xsl:attribute name="end"> + <xsl:value-of select="concat(pressureEnd, ' bar')"/> + </xsl:attribute> + </xsl:if> + <xsl:if test="tankSize != ''"> + <xsl:attribute name="size"> + <xsl:value-of select="concat(tankSize, ' l')"/> + </xsl:attribute> + </xsl:if> + <xsl:if test="workingPressure != ''"> + <xsl:attribute name="workpressure"> + <xsl:value-of select="concat(workingPressure, ' bar')"/> + </xsl:attribute> + </xsl:if> + </cylinder> + </xsl:for-each> + + <temperature> + <xsl:if test="tempAir != ''"> + <xsl:attribute name="air"> + <xsl:value-of select="concat(tempAir, ' C')"/> + </xsl:attribute> + </xsl:if> + <xsl:if test="tempLow != ''"> + <xsl:attribute name="water"> + <xsl:value-of select="concat(tempLow, ' C')"/> + </xsl:attribute> + </xsl:if> + <xsl:if test="tempair != ''"> + <xsl:attribute name="air"> + <xsl:value-of select="concat(tempair, ' C')"/> + </xsl:attribute> + </xsl:if> + <xsl:if test="templow != ''"> + <xsl:attribute name="water"> + <xsl:value-of select="concat(templow, ' C')"/> + </xsl:attribute> + </xsl:if> + </temperature> + + <xsl:if test="diveMaster"> + <divemaster> + <xsl:value-of select="diveMaster"/> + </divemaster> + </xsl:if> + <buddy> + <xsl:for-each select="buddies/buddy"> + <xsl:choose> + <xsl:when test="following-sibling::*[1] != ''"> + <xsl:value-of select="concat(., ', ')"/> + </xsl:when> + <xsl:otherwise> + <xsl:value-of select="."/> + </xsl:otherwise> + </xsl:choose> + </xsl:for-each> + </buddy> + + <xsl:if test="weight != ''"> + <weightsystem> + <xsl:attribute name="weight"> + <xsl:value-of select="weight"/> + </xsl:attribute> + <xsl:attribute name="description"> + <xsl:value-of select="'unknown'"/> + </xsl:attribute> + </weightsystem> + </xsl:if> + + <xsl:for-each select="samples/sample"> + <sample> + <xsl:attribute name="time"> + <xsl:call-template name="timeConvert"> + <xsl:with-param name="timeSec"> + <xsl:value-of select="time"/> + </xsl:with-param> + <xsl:with-param name="units" select="$units"/> + </xsl:call-template> + </xsl:attribute> + <xsl:attribute name="depth"> + <xsl:value-of select="concat(depth, ' m')"/> + </xsl:attribute> + <xsl:if test="pressure != ''"> + <xsl:attribute name="pressure"> + <xsl:value-of select="concat(pressure, ' bar')"/> + </xsl:attribute> + </xsl:if> + <xsl:if test="temperature != ''"> + <xsl:attribute name="temp"> + <xsl:value-of select="concat(temperature, ' C')"/> + </xsl:attribute> + </xsl:if> + </sample> + + <xsl:if test="alarm != ''"> + <event> + <xsl:attribute name="time"> + <xsl:call-template name="timeConvert"> + <xsl:with-param name="timeSec"> + <xsl:value-of select="time"/> + </xsl:with-param> + <xsl:with-param name="units" select="$units"/> + </xsl:call-template> + </xsl:attribute> + <xsl:attribute name="name"> + <xsl:choose> + <xsl:when test="alarm = 'attention'"> + <xsl:value-of select="'violation'"/> + </xsl:when> + <xsl:when test="alarm = 'ascent_rate'"> + <xsl:value-of select="'ascent'"/> + </xsl:when> + <xsl:otherwise> + <xsl:value-of select="alarm"/> + </xsl:otherwise> + </xsl:choose> + </xsl:attribute> + </event> + </xsl:if> + </xsl:for-each> + + </dive> + </xsl:template> + + <!-- convert time in seconds to minutes:seconds --> + <xsl:template name="timeConvert"> + <xsl:param name="timeSec"/> + <xsl:param name="units"/> + + <xsl:if test="$timeSec != ''"> + <xsl:choose> + <xsl:when test="$units = 'Metric'"> + <xsl:value-of select="concat(floor(number($timeSec) div 60), ':', format-number(floor(number($timeSec) mod 60), '00'), ' min')"/> + </xsl:when> + </xsl:choose> + </xsl:if> + </xsl:template> + <!-- end convert time --> + +</xsl:stylesheet> |