[PATCH] Import MacDive divelogs

Miika Turkia miika.turkia at gmail.com
Wed Feb 6 11:31:40 PST 2013


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 at gmail.com>
---
 parse-xml.c       |    1 +
 xslt/MacDive.xslt |  260 +++++++++++++++++++++++++++++++++++++++++++++++++++++
 2 files changed, 261 insertions(+)
 create mode 100644 xslt/MacDive.xslt

diff --git a/parse-xml.c b/parse-xml.c
index 3bf9de9..2bc68c6 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 0000000..2ddeb27
--- /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>
-- 
1.7.9.5



More information about the subsurface mailing list