<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-import' version='2'> <dives> <xsl:apply-templates select="/Divinglog/Logbook/Dive"/> </dives> </divelog> </xsl:template> <xsl:template match="Dive"> <dive> <xsl:attribute name="number"> <xsl:value-of select="Number"/> </xsl:attribute> <xsl:if test="rating > 0"> <xsl:attribute name="rating"> <xsl:value-of select="Rating"/> </xsl:attribute> </xsl:if> <xsl:attribute name="date"> <xsl:value-of select="Divedate"/> </xsl:attribute> <xsl:attribute name="time"> <xsl:value-of select="Entrytime"/> </xsl:attribute> <xsl:attribute name="duration"> <xsl:choose> <xsl:when test="string-length(Divetime) - string-length(translate(./Divetime, '.', '')) = 1"> <xsl:value-of select="concat(substring-before(Divetime, '.'), ':', format-number((substring-after(Divetime, '.') * 60 div 100), '00'), ' min')"/> </xsl:when> <xsl:otherwise> <xsl:value-of select="concat(Divetime, ' min')"/> </xsl:otherwise> </xsl:choose> </xsl:attribute> <depth> <xsl:if test="Depth != ''"> <xsl:attribute name="max"> <xsl:value-of select="concat(Depth, ' m')"/> </xsl:attribute> </xsl:if> <xsl:if test="DepthAvg != ''"> <xsl:attribute name="mean"> <xsl:value-of select="concat(DepthAvg, ' m')"/> </xsl:attribute> </xsl:if> </depth> <location> <xsl:for-each select="Country/@Name | City/@Name | Place/@Name"> <xsl:if test="position() != 1"> / </xsl:if> <xsl:value-of select="."/> </xsl:for-each> </location> <xsl:if test="Place/Lat != ''"> <gps> <xsl:value-of select="concat(Place/Lat, ' ', Place/Lon)"/> </gps> </xsl:if> <xsl:if test="Buddy/@Names != ''"> <buddy> <xsl:value-of select="Buddy/@Names"/> </buddy> </xsl:if> <xsl:if test="Divemaster != ''"> <divemaster> <xsl:value-of select="Divemaster"/> </divemaster> </xsl:if> <cylinder> <xsl:attribute name="description"> <xsl:value-of select="Tanktype"/> </xsl:attribute> <xsl:attribute name="start"> <xsl:value-of select="PresS"/> </xsl:attribute> <xsl:attribute name="end"> <xsl:value-of select="PresE"/> </xsl:attribute> <xsl:attribute name="size"> <xsl:choose> <xsl:when test="DblTank = 'False'"> <xsl:value-of select="Tanksize"/> </xsl:when> <xsl:otherwise> <xsl:value-of select="format-number(Tanksize * 2, '#.##')"/> </xsl:otherwise> </xsl:choose> </xsl:attribute> <xsl:if test="O2 != ''"> <xsl:attribute name="o2"> <xsl:value-of select="concat(O2, '%')"/> </xsl:attribute> </xsl:if> <xsl:if test="Gas != ''"> <xsl:attribute name="o2"> <xsl:value-of select="substring-after(substring-before(Gas, ')'), 'O2=')"/> </xsl:attribute> </xsl:if> <xsl:if test="He != ''"> <xsl:attribute name="he"> <xsl:value-of select="concat(He, '%')"/> </xsl:attribute> </xsl:if> </cylinder> <temperature> <xsl:if test="Airtemp != ''"> <xsl:attribute name="air"> <xsl:value-of select="concat(Airtemp, ' C')"/> </xsl:attribute> </xsl:if> <xsl:if test="Watertemp != ''"> <xsl:attribute name="water"> <xsl:value-of select="concat(Watertemp, ' C')"/> </xsl:attribute> </xsl:if> </temperature> <suit> <xsl:value-of select="Divesuit"/> </suit> <xsl:if test="Weight != ''"> <weightsystem> <!-- Is weight always in kilograms? --> <xsl:attribute name="weight"> <xsl:value-of select="concat(Weight, ' kg')"/> </xsl:attribute> <xsl:attribute name="description"> <xsl:value-of select="'unknown'"/> </xsl:attribute> </weightsystem> </xsl:if> <notes> <xsl:value-of select="Comments"/> </notes> <!-- Trying to detect if depth samples are in Imperial or Metric units. This is based on an assumption that maximum depth of a dive is recorded in metric and if samples contain bigger values, they must be imperial. --> <xsl:variable name="max"> <xsl:for-each select="Profile/P/Depth"> <xsl:sort select="." data-type="number" order="descending"/> <xsl:if test="position() = 1"><xsl:value-of select="."/></xsl:if> </xsl:for-each> </xsl:variable> <xsl:variable name="depthUnit"> <xsl:choose> <xsl:when test="$max > Depth + 1"> <xsl:value-of select="'imperial'"/> </xsl:when> <xsl:otherwise> <xsl:value-of select="'metric'"/> </xsl:otherwise> </xsl:choose> </xsl:variable> <divecomputer> <xsl:if test="Computer != ''"> <xsl:attribute name="model"> <xsl:value-of select="Computer"/> </xsl:attribute> </xsl:if> <xsl:for-each select="Profile/P"> <sample> <xsl:attribute name="time"> <xsl:value-of select="concat(floor(number(./@Time) div 60), ':', format-number(floor(number(./@Time) mod 60), '00'), ' min')"/> </xsl:attribute> <!-- This looks like pure guess work to figure out the unit --> <xsl:if test="Temp != ''"> <xsl:attribute name="temp"> <xsl:choose> <xsl:when test="Temp > 32"> <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:attribute> </xsl:if> <!-- How does this pressure information work? How do we know which pressure information is in use? Until further information, just grab "randomly" the first pressure reading --> <xsl:attribute name="pressure"> <xsl:value-of select="Press1"/> </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="depthUnit"> <xsl:value-of select="$depthUnit"/> </xsl:with-param> </xsl:call-template> </xsl:attribute> </sample> </xsl:for-each> </divecomputer> </dive> </xsl:template> <!-- convert depth to meters --> <xsl:template name="depthConvert"> <xsl:param name="depth"/> <xsl:param name="depthUnit"/> <xsl:if test="$depth != ''"> <xsl:choose> <xsl:when test="$depthUnit = 'imperial'"> <xsl:value-of select="concat(format-number($depth div 3.2808, '##.#'), ' m')"/> </xsl:when> <xsl:otherwise> <xsl:value-of select="concat($depth, ' m')"/> </xsl:otherwise> </xsl:choose> </xsl:if> </xsl:template> <!-- end convert depth --> </xsl:stylesheet>