subsurface/xslt/divelogs-export.xslt
Miika Turkia f38f8ce4c9 Add importing of working pressure from divelogs.de
We were missing the import of cylinders' working pressure when syncing
with divelogs.de. This piece of information is required for proper unit
conversions when user uses imperial units for displaying the
dive information. (Both Subsurface and divelogs.de use metric
internally, or at least the export from divelogs.de is in metric.)

See #907

Signed-off-by: Miika Turkia <miika.turkia@gmail.com>
Signed-off-by: Dirk Hohndel <dirk@hohndel.org>
2015-09-12 12:36:26 -07:00

405 lines
14 KiB
HTML

<?xml version="1.0" encoding="iso-8859-1"?>
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="1.0">
<xsl:include href="commonTemplates.xsl"/>
<xsl:strip-space elements="*"/>
<xsl:output method="xml" encoding="UTF-8" indent="yes"
cdata-section-elements="LOCATION SITE WEATHER WATERVIZIBILITY PARTNER BOATNAME CYLINDERDESCRIPTION LOGNOTES"
/>
<xsl:template match="/divelog/dives">
<xsl:apply-templates select="dive"/>
</xsl:template>
<xsl:template match="dive">
<DIVELOGSDATA>
<DIVELOGSNUMBER>
<xsl:value-of select="@number"/>
</DIVELOGSNUMBER>
<DATE>
<xsl:value-of select="concat(substring-after(substring-after(@date, '-'), '-'), '.', substring-before(substring-after(@date, '-'), '-'), '.', substring-before(@date, '-'))"/>
</DATE>
<TIME>
<xsl:value-of select="@time"/>
</TIME>
<xsl:variable name="duration">
<xsl:call-template name="time2sec">
<xsl:with-param name="time">
<xsl:value-of select="@duration"/>
</xsl:with-param>
</xsl:call-template>
</xsl:variable>
<DIVETIMESEC>
<xsl:value-of select="$duration"/>
</DIVETIMESEC>
<xsl:variable name="uuid">
<xsl:value-of select="@divesiteid"/>
</xsl:variable>
<LOCATION>
<xsl:value-of select="//site[@uuid = $uuid]/@name"/>
</LOCATION>
<WATERVIZIBILITY>
<xsl:value-of select="@visibility"/>
</WATERVIZIBILITY>
<PARTNER>
<xsl:value-of select="buddy"/>
</PARTNER>
<!-- If there is a gas change event within the first few seconds
then we try to detect matching cylinder, otherwise the first
cylinder is used.
-->
<xsl:variable name="time">
<xsl:call-template name="time2sec">
<xsl:with-param name="time">
<xsl:value-of select="event[@name = 'gaschange']/@time"/>
</xsl:with-param>
</xsl:call-template>
</xsl:variable>
<xsl:variable name="mix">
<xsl:value-of select="concat(event[@name = 'gaschange']/@value, '.0%')"/>
</xsl:variable>
<xsl:variable name="cylinder">
<xsl:choose>
<xsl:when test="$time &lt; 60">
<xsl:value-of select="count(cylinder[@o2 = $mix]/preceding-sibling::cylinder) + 1"/>
</xsl:when>
<xsl:otherwise>
<xsl:value-of select="1"/>
</xsl:otherwise>
</xsl:choose>
</xsl:variable>
<CYLINDERDESCRIPTION>
<xsl:value-of select="cylinder[position() = $cylinder]/@description"/>
</CYLINDERDESCRIPTION>
<xsl:variable name="double">
<xsl:choose>
<xsl:when test="substring(cylinder[position() = $cylinder]/@description, 1, 1) = 'D' and substring-before(substring(cylinder[position() = $cylinder]/@description, 2), ' ') * 2 = substring-before(cylinder[position() = $cylinder]/@size, ' ')">
<xsl:value-of select="'2'"/>
</xsl:when>
<xsl:otherwise>
<xsl:value-of select="'1'"/>
</xsl:otherwise>
</xsl:choose>
</xsl:variable>
<DBLTANK>
<xsl:value-of select="$double - 1"/>
</DBLTANK>
<CYLINDERSIZE>
<xsl:value-of select="substring-before(cylinder[position() = $cylinder]/@size, ' ') div $double"/>
</CYLINDERSIZE>
<CYLINDERSTARTPRESSURE>
<xsl:choose>
<xsl:when test="node()/sample/@pressure != ''">
<xsl:value-of select="substring-before(node()/sample/@pressure, ' ')"/>
</xsl:when>
<xsl:otherwise>
<xsl:value-of select="cylinder[position() = $cylinder]/@start"/>
</xsl:otherwise>
</xsl:choose>
</CYLINDERSTARTPRESSURE>
<CYLINDERENDPRESSURE>
<xsl:choose>
<xsl:when test="count(node()/sample[@pressure!='']) &gt; 0">
<xsl:value-of select="node()/sample[@pressure][last()]/@pressure"/>
</xsl:when>
<xsl:otherwise>
<xsl:value-of select="cylinder[position() = $cylinder]/@end"/>
</xsl:otherwise>
</xsl:choose>
</CYLINDERENDPRESSURE>
<xsl:if test="cylinder[position() = $cylinder]/@workpressure != ''">
<WORKINGPRESSURE>
<xsl:value-of select="substring-before(cylinder[position() = $cylinder]/@workpressure, ' ')"/>
</WORKINGPRESSURE>
</xsl:if>
<ADDITIONALTANKS>
<xsl:for-each select="cylinder[position() != $cylinder]">
<xsl:variable name="gas">
<xsl:choose>
<xsl:when test="@o2 != ''">
<xsl:value-of select="substring-before(@o2, '.')"/>
</xsl:when>
<xsl:otherwise>
<xsl:value-of select="'21'"/>
</xsl:otherwise>
</xsl:choose>
</xsl:variable>
<xsl:if test="following-sibling::divecomputer/event[@name='gaschange' and @value=$gas] or substring-before(@start, ' ') - 5 &gt; substring-before(@end, ' ')">
<xsl:variable name="cur_cyl">
<xsl:value-of select="position()"/>
</xsl:variable>
<TANK>
<CYLINDERDESCRIPTION>
<xsl:value-of select="@description"/>
</CYLINDERDESCRIPTION>
<xsl:variable name="dbl">
<xsl:choose>
<xsl:when test="substring(@description, 1, 1) = 'D' and substring-before(substring(@description, 2), ' ') * 2 = substring-before(@size, ' ')">
<xsl:value-of select="'2'"/>
</xsl:when>
<xsl:otherwise>
<xsl:value-of select="'1'"/>
</xsl:otherwise>
</xsl:choose>
</xsl:variable>
<DBLTANK>
<xsl:value-of select="$dbl - 1"/>
</DBLTANK>
<CYLINDERSIZE>
<xsl:value-of select="substring-before(@size, ' ') div $dbl"/>
</CYLINDERSIZE>
<CYLINDERSTARTPRESSURE>
<xsl:value-of select="@start"/>
</CYLINDERSTARTPRESSURE>
<CYLINDERENDPRESSURE>
<xsl:value-of select="@end"/>
</CYLINDERENDPRESSURE>
<xsl:if test="@workpressure != ''">
<WORKINGPRESSURE>
<xsl:value-of select="substring-before(@workpressure, ' ')"/>
</WORKINGPRESSURE>
</xsl:if>
<O2PCT>
<xsl:value-of select="substring-before(@o2, '%')"/>
</O2PCT>
<HEPCT>
<xsl:value-of select="substring-before(@he, '%')"/>
</HEPCT>
</TANK>
</xsl:if>
</xsl:for-each>
</ADDITIONALTANKS>
<WEIGHT>
<xsl:call-template name="sum">
<xsl:with-param name="values" select="weightsystem/@weight"/>
</xsl:call-template>
</WEIGHT>
<O2PCT>
<xsl:value-of select="substring-before(cylinder[position() = $cylinder]/@o2, '%')"/>
</O2PCT>
<HEPCT>
<xsl:value-of select="substring-before(cylinder[position() = $cylinder]/@he, '%')"/>
</HEPCT>
<LOGNOTES>
<xsl:value-of select="notes"/>
</LOGNOTES>
<LAT>
<xsl:value-of select="substring-before(//site[@uuid = $uuid]/@gps, ' ')"/>
</LAT>
<LNG>
<xsl:value-of select="substring-after(//site[@uuid = $uuid]/@gps, ' ')"/>
</LNG>
<MAXDEPTH>
<xsl:value-of select="substring-before(node()/depth/@max, ' ')"/>
</MAXDEPTH>
<MEANDEPTH>
<xsl:value-of select="substring-before(node()/depth/@mean, ' ')"/>
</MEANDEPTH>
<AIRTEMP>
<xsl:value-of select="substring-before(node()/temperature/@air, ' ')"/>
</AIRTEMP>
<WATERTEMPMAXDEPTH>
<xsl:value-of select="substring-before(node()/temperature/@water, ' ')"/>
</WATERTEMPMAXDEPTH>
<xsl:variable name="manual">
<xsl:choose>
<xsl:when test="divecomputer/@model = 'manually added dive'">
<xsl:value-of select="1"/>
</xsl:when>
<xsl:otherwise>
<xsl:value-of select="0"/>
</xsl:otherwise>
</xsl:choose>
</xsl:variable>
<!-- Test if dive computer requires special handling -->
<xsl:variable name="special">
<xsl:choose>
<xsl:when test="divecomputer/@model = 'Suunto EON Steel'">
<xsl:text>1</xsl:text>
</xsl:when>
</xsl:choose>
</xsl:variable>
<SAMPLEINTERVAL>
<xsl:choose>
<xsl:when test="$special = 1">
<xsl:variable name="samples">
<xsl:value-of select="count(//sample/@time)"/>
</xsl:variable>
<xsl:value-of select="ceiling($duration div $samples)"/>
</xsl:when>
<xsl:otherwise>
<xsl:variable name="first">
<xsl:call-template name="time2sec">
<xsl:with-param name="time">
<xsl:value-of select="node()/sample[1]/@time"/>
</xsl:with-param>
</xsl:call-template>
</xsl:variable>
<xsl:variable name="second">
<xsl:call-template name="time2sec">
<xsl:with-param name="time">
<xsl:value-of select="node()/sample[2]/@time"/>
</xsl:with-param>
</xsl:call-template>
</xsl:variable>
<xsl:choose>
<xsl:when test="$manual = 0">
<xsl:value-of select="$second - $first"/>
</xsl:when>
<xsl:otherwise>
<xsl:value-of select="60"/>
</xsl:otherwise>
</xsl:choose>
</xsl:otherwise>
</xsl:choose>
</SAMPLEINTERVAL>
<xsl:for-each select="divecomputer[1]/sample">
<xsl:choose>
<xsl:when test="$manual = 1 and @time != '0:00 min'">
<xsl:variable name="timesecond">
<xsl:call-template name="time2sec">
<xsl:with-param name="time" select="@time"/>
</xsl:call-template>
</xsl:variable>
<xsl:variable name="timefirst">
<xsl:call-template name="time2sec">
<xsl:with-param name="time" select="preceding-sibling::sample[1]/@time"/>
</xsl:call-template>
</xsl:variable>
<xsl:call-template name="while">
<xsl:with-param name="until">
<xsl:value-of select="($timesecond - $timefirst) div 60 - 1"/>
</xsl:with-param>
<xsl:with-param name="count">
<xsl:value-of select="0"/>
</xsl:with-param>
<xsl:with-param name="timefirst">
<xsl:value-of select="$timefirst"/>
</xsl:with-param>
<xsl:with-param name="timesecond">
<xsl:value-of select="$timesecond"/>
</xsl:with-param>
<xsl:with-param name="depthsecond">
<xsl:call-template name="depth2mm">
<xsl:with-param name="depth">
<xsl:value-of select="./@depth"/>
</xsl:with-param>
</xsl:call-template>
</xsl:with-param>
<xsl:with-param name="depthfirst">
<xsl:call-template name="depth2mm">
<xsl:with-param name="depth">
<xsl:value-of select="preceding-sibling::sample[1]/@depth"/>
</xsl:with-param>
</xsl:call-template>
</xsl:with-param>
</xsl:call-template>
<!-- <name select="{concat(@time, ' - ', preceding-sibling::sample[1]/@time)}"/>-->
</xsl:when>
<xsl:otherwise>
<xsl:choose>
<!-- Suunto EON Steel special case -->
<xsl:when test="$special = 1">
<xsl:variable name="cur">
<xsl:call-template name="time2sec">
<xsl:with-param name="time">
<xsl:value-of select="@time"/>
</xsl:with-param>
</xsl:call-template>
</xsl:variable>
<xsl:variable name="prev">
<xsl:call-template name="time2sec">
<xsl:with-param name="time">
<xsl:value-of select="preceding-sibling::sample[1]/@time"/>
</xsl:with-param>
</xsl:call-template>
</xsl:variable>
<xsl:variable name="prevprev">
<xsl:call-template name="time2sec">
<xsl:with-param name="time">
<xsl:value-of select="preceding-sibling::sample[2]/@time"/>
</xsl:with-param>
</xsl:call-template>
</xsl:variable>
<xsl:choose>
<xsl:when test="$cur - $prev &gt;= 10 or $prev = 0 or $prevprev = 0">
<SAMPLE>
<DEPTH>
<xsl:value-of select="substring-before(./@depth, ' ')"/>
</DEPTH>
</SAMPLE>
</xsl:when>
</xsl:choose>
</xsl:when>
<xsl:otherwise>
<SAMPLE>
<DEPTH>
<xsl:value-of select="substring-before(./@depth, ' ')"/>
</DEPTH>
</SAMPLE>
</xsl:otherwise>
</xsl:choose>
</xsl:otherwise>
</xsl:choose>
</xsl:for-each>
</DIVELOGSDATA>
</xsl:template>
<xsl:template name="while">
<xsl:param name="timefirst"/>
<xsl:param name="timesecond"/>
<xsl:param name="depthfirst"/>
<xsl:param name="depthsecond"/>
<xsl:param name="count"/>
<xsl:param name="until"/>
<xsl:variable name="curdepth">
<xsl:value-of select="format-number(((($timefirst + 60) - $timefirst) div ($timesecond - $timefirst) * ($depthsecond - $depthfirst) + $depthfirst), '#.##')"/>
</xsl:variable>
<xsl:variable name="curtime">
<xsl:value-of select="$timefirst + 60"/>
</xsl:variable>
<xsl:choose>
<xsl:when test="$count &lt; $until">
<SAMPLE>
<DEPTH>
<xsl:value-of select="$curdepth div 1000"/>
</DEPTH>
</SAMPLE>
<xsl:call-template name="while">
<xsl:with-param name="timefirst" select="$curtime"/>
<xsl:with-param name="timesecond" select="$timesecond"/>
<xsl:with-param name="depthfirst" select="$curdepth"/>
<xsl:with-param name="depthsecond" select="$depthsecond"/>
<xsl:with-param name="count" select="$count + 1"/>
<xsl:with-param name="until" select="$until"/>
</xsl:call-template>
</xsl:when>
<xsl:otherwise>
<xsl:if test="$curdepth &gt; 0">
<SAMPLE>
<DEPTH>
<xsl:value-of select="$curdepth div 1000"/>
</DEPTH>
</SAMPLE>
</xsl:if>
</xsl:otherwise>
</xsl:choose>
</xsl:template>
</xsl:stylesheet>