subsurface/xslt/MacDive.xslt
Miika Turkia a9cc7f9b10 Fix import when locale set to decimal comma
This should take care of locale caused problems when the input uses decimal
point but locale uses decimal comma. Also the sample I have of Suunto DM3
format weight is represented with comma instead of dot so converting that as
well.

Signed-off-by: Miika Turkia <miika.turkia@gmail.com>
Signed-off-by: Dirk Hohndel <dirk@hohndel.org>
2013-03-07 10:27:20 -08:00

513 lines
18 KiB
HTML

<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>
<xsl:for-each select="/dives/dive">
<divecomputerid deviceid="ffffffff">
<xsl:attribute name="model">
<xsl:value-of select="computer"/>
</xsl:attribute>
<xsl:attribute name="serial">
<xsl:value-of select="serial"/>
</xsl:attribute>
</divecomputerid>
</xsl:for-each>
</settings>
<dives>
<xsl:apply-templates select="/dives/dive"/>
</dives>
</divelog>
</xsl:template>
<xsl:template match="dive">
<xsl:variable name="units" select="/dives/units"/>
<!-- Count the amount of temeprature samples during the dive -->
<xsl:variable name="temperatureSamples">
<xsl:call-template name="temperatureSamples" select="/dives/dive/samples">
<xsl:with-param name="units" select="$units"/>
</xsl:call-template>
</xsl:variable>
<!-- Count the amount of pressure samples during the dive -->
<xsl:variable name="pressureSamples">
<xsl:call-template name="pressureSamples" select="/dives/dive/samples"/>
</xsl:variable>
<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:if test="rating != ''">
<xsl:attribute name="rating">
<xsl:value-of select="rating"/>
</xsl:attribute>
</xsl:if>
<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>
<xsl:attribute name="max">
<xsl:call-template name="depthConvert">
<xsl:with-param name="depth">
<xsl:value-of select="maxdepth"/>
</xsl:with-param>
<xsl:with-param name="units" select="$units"/>
</xsl:call-template>
</xsl:attribute>
<xsl:attribute name="mean">
<xsl:call-template name="depthConvert">
<xsl:with-param name="depth">
<xsl:value-of select="avgdepth"/>
</xsl:with-param>
<xsl:with-param name="units" select="$units"/>
</xsl:call-template>
</xsl:attribute>
</depth>
</xsl:when>
<xsl:otherwise>
<depth>
<xsl:attribute name="max">
<xsl:call-template name="depthConvert">
<xsl:with-param name="depth">
<xsl:value-of select="maxDepth"/>
</xsl:with-param>
<xsl:with-param name="units" select="$units"/>
</xsl:call-template>
</xsl:attribute>
<xsl:attribute name="mean">
<xsl:call-template name="depthConvert">
<xsl:with-param name="depth">
<xsl:value-of select="averageDepth"/>
</xsl:with-param>
<xsl:with-param name="units" select="$units"/>
</xsl:call-template>
</xsl:attribute>
</depth>
</xsl:otherwise>
</xsl:choose>
<xsl:variable name="delta">
<xsl:value-of select="sampleInterval"/>
</xsl:variable>
<location>
<xsl:for-each select="country|location|site">
<xsl:choose>
<xsl:when test="following-sibling::location[1] != ''">
<xsl:value-of select="concat(., ' / ')"/>
</xsl:when>
<xsl:when test="following-sibling::site[1] != ''">
<xsl:value-of select="concat(., ' / ')"/>
</xsl:when>
<xsl:otherwise>
<xsl:value-of select="."/>
</xsl:otherwise>
</xsl:choose>
</xsl:for-each>
</location>
<!-- This will discard GPS coordinates of 0 0 but I suppose that
is better than all non-gps dives to be in that location -->
<xsl:if test="sitelat != 0">
<gps>
<xsl:value-of select="concat(sitelat, ' ', sitelon)"/>
</gps>
</xsl:if>
<xsl:if test="siteLat != 0">
<gps>
<xsl:value-of select="concat(siteLat, ' ', siteLon)"/>
</gps>
</xsl:if>
<notes>
<xsl:value-of select="notes"/>
</notes>
<divecomputer deviceid="ffffffff">
<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 &gt; 0">
<xsl:attribute name="start">
<xsl:call-template name="pressureConvert">
<xsl:with-param name="number" select="pressureStart"/>
<xsl:with-param name="units" select="$units"/>
</xsl:call-template>
</xsl:attribute>
</xsl:if>
<xsl:if test="pressureEnd &gt; 0">
<xsl:attribute name="end">
<xsl:call-template name="pressureConvert">
<xsl:with-param name="number" select="pressureEnd"/>
<xsl:with-param name="units" select="$units"/>
</xsl:call-template>
</xsl:attribute>
</xsl:if>
<xsl:if test="tankSize &gt; 0">
<xsl:attribute name="size">
<xsl:call-template name="sizeConvert">
<xsl:with-param name="singleSize" select="tankSize"/>
<xsl:with-param name="double" select="double"/>
<xsl:with-param name="pressure" select="workingPressure"/>
<xsl:with-param name="units" select="$units"/>
</xsl:call-template>
</xsl:attribute>
</xsl:if>
<xsl:if test="workingPressure &gt; 0">
<xsl:attribute name="workpressure">
<xsl:call-template name="pressureConvert">
<xsl:with-param name="number" select="workingPressure"/>
<xsl:with-param name="units" select="$units"/>
</xsl:call-template>
</xsl:attribute>
</xsl:if>
<xsl:if test="tankName != ''">
<xsl:attribute name="description">
<xsl:value-of select="tankName"/>
</xsl:attribute>
</xsl:if>
</cylinder>
</xsl:for-each>
<temperature>
<!-- If we have temperature reading and it is non-zero, we use
it. If the temperature is zero, we only use it if we have
temperature samples from the dive. -->
<xsl:if test="tempAir != ''">
<xsl:variable name="air">
<xsl:call-template name="tempConvert">
<xsl:with-param name="temp" select="tempAir"/>
<xsl:with-param name="units" select="$units"/>
</xsl:call-template>
</xsl:variable>
<xsl:if test="substring-before($air, ' ') != 0 or $temperatureSamples &gt; 0">
<xsl:attribute name="air">
<xsl:value-of select="$air"/>
</xsl:attribute>
</xsl:if>
</xsl:if>
<xsl:if test="tempLow != ''">
<xsl:variable name="water">
<xsl:call-template name="tempConvert">
<xsl:with-param name="temp" select="tempLow"/>
<xsl:with-param name="units" select="$units"/>
</xsl:call-template>
</xsl:variable>
<xsl:if test="substring-before($water, ' ') != 0 or $temperatureSamples &gt; 0">
<xsl:attribute name="water">
<xsl:value-of select="$water"/>
</xsl:attribute>
</xsl:if>
</xsl:if>
<xsl:if test="tempair != ''">
<xsl:variable name="air">
<xsl:call-template name="tempConvert">
<xsl:with-param name="temp" select="tempair"/>
<xsl:with-param name="units" select="$units"/>
</xsl:call-template>
</xsl:variable>
<xsl:if test="substring-before($air, ' ') != 0 or $temperatureSamples &gt; 0">
<xsl:attribute name="air">
<xsl:value-of select="$air"/>
</xsl:attribute>
</xsl:if>
</xsl:if>
<xsl:if test="templow != ''">
<xsl:variable name="water">
<xsl:call-template name="tempConvert">
<xsl:with-param name="temp" select="temlow"/>
<xsl:with-param name="units" select="$units"/>
</xsl:call-template>
</xsl:variable>
<xsl:if test="substring-before($water, ' ') != 0 or $temperatureSamples &gt; 0">
<xsl:attribute name="water">
<xsl:value-of select="$water"/>
</xsl:attribute>
</xsl:if>
</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:call-template name="weightConvert">
<xsl:with-param name="weight" select="weight"/>
<xsl:with-param name="units" select="$units"/>
</xsl:call-template>
</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:call-template name="depthConvert">
<xsl:with-param name="depth">
<xsl:value-of select="depth"/>
</xsl:with-param>
<xsl:with-param name="units" select="$units"/>
</xsl:call-template>
</xsl:attribute>
<xsl:if test="pressure != '' and $pressureSamples &gt; 0">
<xsl:attribute name="pressure">
<xsl:call-template name="pressureConvert">
<xsl:with-param name="number" select="pressure"/>
<xsl:with-param name="units" select="$units"/>
</xsl:call-template>
</xsl:attribute>
</xsl:if>
<xsl:if test="temperature != '' and $temperatureSamples &gt; 0">
<xsl:attribute name="temp">
<xsl:call-template name="tempConvert">
<xsl:with-param name="temp" select="temperature"/>
<xsl:with-param name="units" select="$units"/>
</xsl:call-template>
</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:when test="alarm = 'deep_stop'">
<xsl:value-of select="'deepstop'"/>
</xsl:when>
<xsl:when test="alarm = 'deco'">
<xsl:value-of select="'deco stop'"/>
</xsl:when>
<xsl:when test="alarm = 'po2_high'">
<xsl:value-of select="'PO2'"/>
</xsl:when>
<xsl:when test="alarm = 'tissue_warning'">
<xsl:value-of select="'tissue level warning'"/>
</xsl:when>
<xsl:when test="alarm = 'user_depth_alarm'">
<xsl:value-of select="'maxdepth'"/>
</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 pressure to bars -->
<xsl:template name="pressureConvert">
<xsl:param name="number"/>
<xsl:param name="units"/>
<xsl:choose>
<xsl:when test="$units = 'Imperial'">
<xsl:value-of select="concat(format-number(($number div 14.5037738007), '#.##'), ' bar')"/>
</xsl:when>
<xsl:otherwise>
<xsl:value-of select="concat($number, ' bar')"/>
</xsl:otherwise>
</xsl:choose>
</xsl:template>
<!-- end convert pressure -->
<!-- convert cuft to litres -->
<xsl:template name="sizeConvert">
<xsl:param name="singleSize"/>
<xsl:param name="double"/>
<xsl:param name="pressure"/>
<xsl:param name="units"/>
<xsl:variable name="size">
<xsl:value-of select="format-number($singleSize + $singleSize * $double, '#.##')"/>
</xsl:variable>
<xsl:choose>
<xsl:when test="$units = 'Imperial'">
<xsl:if test="$pressure != '0'">
<xsl:value-of select="concat(format-number((($size * 14.7 div $pressure) div 0.035315), '#.##'), ' l')"/>
</xsl:if>
</xsl:when>
<xsl:otherwise>
<xsl:value-of select="concat($size, ' l')"/>
</xsl:otherwise>
</xsl:choose>
</xsl:template>
<!-- end convert pressure -->
<!-- convert temperature from F to C -->
<xsl:template name="tempConvert">
<xsl:param name="temp"/>
<xsl:param name="units"/>
<xsl:choose>
<xsl:when test="$units = 'Imperial'">
<xsl:value-of select="concat(format-number(($temp - 32) * 5 div 9, '0.0'), ' C')"/>
</xsl:when>
<xsl:otherwise>
<xsl:value-of select="concat($temp, ' C')"/>
</xsl:otherwise>
</xsl:choose>
</xsl:template>
<!-- end convert temperature -->
<!-- convert time in seconds to minutes:seconds -->
<xsl:template name="timeConvert">
<xsl:param name="timeSec"/>
<xsl:param name="units"/>
<xsl:if test="$timeSec != ''">
<xsl:value-of select="concat(floor(number($timeSec) div 60), ':', format-number(floor(number($timeSec) mod 60), '00'), ' min')"/>
</xsl:if>
</xsl:template>
<!-- end convert time -->
<!-- convert depth to meters -->
<xsl:template name="depthConvert">
<xsl:param name="depth"/>
<xsl:param name="units"/>
<xsl:choose>
<xsl:when test="$units = 'Imperial'">
<xsl:value-of select="concat(format-number(($depth * 0.3048), '#.##'), ' m')"/>
</xsl:when>
<xsl:otherwise>
<xsl:value-of select="concat($depth, ' m')"/>
</xsl:otherwise>
</xsl:choose>
</xsl:template>
<!-- end convert depth -->
<!-- convert weight to kg -->
<xsl:template name="weightConvert">
<xsl:param name="weight"/>
<xsl:param name="units"/>
<xsl:choose>
<xsl:when test="$weight &gt; 0">
<xsl:choose>
<xsl:when test="$units = 'Imperial'">
<xsl:value-of select="concat(format-number(($weight * 0.453592), '#.##'), ' kg')"/>
</xsl:when>
<xsl:otherwise>
<xsl:value-of select="concat($weight, ' kg')"/>
</xsl:otherwise>
</xsl:choose>
</xsl:when>
<xsl:otherwise>
<xsl:value-of select="$weight"/>
</xsl:otherwise>
</xsl:choose>
</xsl:template>
<!-- end convert weight -->
<xsl:template name="temperatureSamples">
<xsl:param name="units"/>
<xsl:choose>
<xsl:when test="$units = 'Imperial'">
<xsl:value-of select="count(descendant::temperature[. != 32])"/>
</xsl:when>
<xsl:otherwise>
<xsl:value-of select="count(descendant::temperature[. != 0])"/>
</xsl:otherwise>
</xsl:choose>
</xsl:template>
<xsl:template name="pressureSamples">
<xsl:value-of select="count(descendant::pressure[. &gt; 0])"/>
</xsl:template>
</xsl:stylesheet>