summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorGravatar Miika Turkia <miika.turkia@gmail.com>2013-02-06 21:31:40 +0200
committerGravatar Dirk Hohndel <dirk@hohndel.org>2013-02-07 07:06:49 +1100
commitb9a19813eaa104748b3adafc1174b7c4fa0fd10e (patch)
treec27bdeeb31fbc5ee985461ad7bd54593f4e09aba
parent50170e0cf3ed22b7a1eca5426c9c5f9bd1bbf90d (diff)
downloadsubsurface-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.c1
-rw-r--r--xslt/MacDive.xslt260
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>