<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="1.0"> <xsl:strip-space elements="*"/> <xsl:include href="commonTemplates.xsl"/> <xsl:output method="xml" indent="yes"/> <xsl:template match="/"> <divelog program='subsurface-import' 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:attribute name="tags"> <xsl:for-each select="tags/tag|entryType"> <xsl:choose> <xsl:when test="position() = 1"> <xsl:value-of select="."/> </xsl:when> <xsl:otherwise> <xsl:value-of select="concat(',', .)"/> </xsl:otherwise> </xsl:choose> </xsl:for-each> </xsl:attribute> <xsl:variable name="delta"> <xsl:value-of select="sampleInterval"/> </xsl:variable> <xsl:choose> <xsl:when test="site/country|site/location|site/name|site/lat|site/lon"> <location debug="true"> <xsl:for-each select="site/country|site/location|site/name"> <xsl:choose> <xsl:when test="following-sibling::location[1] != '' and . != ''"> <xsl:value-of select="concat(., ' / ')"/> </xsl:when> <xsl:when test="following-sibling::name[1] != '' and . != ''"> <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="site/lat != 0"> <gps> <xsl:value-of select="concat(site/lat, ' ', site/lon)"/> </gps> </xsl:if> </xsl:when> <xsl:otherwise> <location> <xsl:for-each select="country|location|site"> <xsl:choose> <xsl:when test="following-sibling::location[1] != '' and . != ''"> <xsl:value-of select="concat(., ' / ')"/> </xsl:when> <xsl:when test="following-sibling::site[1] != '' and . != ''"> <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> </xsl:otherwise> </xsl:choose> <notes> <xsl:value-of select="notes"/> </notes> <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 > 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 > 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 > 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 > 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> <xsl:for-each select="gases/gas"> <event name="gaschange"> <xsl:attribute name="time"> <xsl:call-template name="sec2time"> <xsl:with-param name="timeSec"> <xsl:value-of select="sum(preceding-sibling::gas/duration)"/> </xsl:with-param> </xsl:call-template> </xsl:attribute> <xsl:attribute name="value"> <xsl:value-of select="helium * 65536 + oxygen"/> </xsl:attribute> </event> </xsl:for-each> <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="translate(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> <divecomputer deviceid="ffffffff"> <xsl:attribute name="model"> <xsl:value-of select="computer"/> </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> <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 > 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 > 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 > 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 > 0"> <xsl:attribute name="water"> <xsl:value-of select="$water"/> </xsl:attribute> </xsl:if> </xsl:if> </temperature> <xsl:if test="current != ''"> <extradata key="current" value="{current}"/> </xsl:if> <xsl:if test="surfaceConditions != ''"> <extradata key="surfaceConditions" value="{surfaceConditions}"/> </xsl:if> <xsl:if test="entryType != ''"> <extradata key="entryType" value="{entryType}"/> </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 > 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 > 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 != '' and alarm != gas_change"> <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> </divecomputer> </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: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 weight to kg --> <xsl:template name="weightConvert"> <xsl:param name="weight"/> <xsl:param name="units"/> <xsl:choose> <xsl:when test="$weight > 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="pressureSamples"> <xsl:value-of select="count(descendant::pressure[. > 0])"/> </xsl:template> </xsl:stylesheet>