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>
This commit is contained in:
Miika Turkia 2013-02-06 21:31:40 +02:00 committed by Dirk Hohndel
parent 50170e0cf3
commit b9a19813ea
2 changed files with 261 additions and 0 deletions

View file

@ -1528,6 +1528,7 @@ static struct xslt_files {
} xslt_files[] = {
{ "SUUNTO", "SuuntoSDM.xslt" },
{ "JDiveLog", "jdivelog2subsurface.xslt" },
{ "dives", "MacDive.xslt" },
{ NULL, }
};

260
xslt/MacDive.xslt Normal file
View file

@ -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>