[PATCH] XSLT for UDDF import

Miika Turkia miika.turkia at gmail.com
Sun Feb 24 08:13:26 PST 2013


This XSLT imports the UDDF logs that I have received samples of. This
includes kenzooid and Heinrichs Weikamp's DR5.

Signed-off-by: Miika Turkia <miika.turkia at gmail.com>
---
This turned out to be a lot more complicated than one would imagine. The
trouble rises from some files using default namespace, others using a
defined namespace. And both of these need to be taken care of. Moreover,
the XML hierarchy DR5 produces has changed between version 0.98 and 1.5.
(The former is probably wrong but this XSLT should still support it.)

I would appreciate if someone else would give this a bit of testing.
---
 parse-xml.c    |    1 +
 xslt/uddf.xslt |  199 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++
 2 files changed, 200 insertions(+)
 create mode 100644 xslt/uddf.xslt

diff --git a/parse-xml.c b/parse-xml.c
index e23ebc0..0a69126 100644
--- a/parse-xml.c
+++ b/parse-xml.c
@@ -1584,6 +1584,7 @@ static struct xslt_files {
 	{ "JDiveLog", "jdivelog2subsurface.xslt" },
 	{ "dives", "MacDive.xslt" },
 	{ "DIVELOGSDATA", "divelogs.xslt" },
+	{ "uddf", "uddf.xslt" },
 	{ NULL, }
 };
 
diff --git a/xslt/uddf.xslt b/xslt/uddf.xslt
new file mode 100644
index 0000000..930805d
--- /dev/null
+++ b/xslt/uddf.xslt
@@ -0,0 +1,199 @@
+<?xml version="1.0"?>
+<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
+  xmlns:u="http://www.streit.cc/uddf/3.2/"
+  exclude-result-prefixes="u"
+  version="1.0">
+  <xsl:strip-space elements="*"/>
+  <xsl:output method="xml" indent="yes"/>
+
+  <xsl:template match="/">
+    <divelog program="subsurface" version="2">
+      <dives>
+        <xsl:apply-templates select="/uddf/profiledata/repetitiongroup/dive|/u:uddf/u:profiledata/u:repetitiongroup/u:dive"/>
+      </dives>
+    </divelog>
+  </xsl:template>
+
+  <!-- Print warning if we don't handle some element -->
+  <xsl:template match="*">
+  <xsl:message terminate="no">
+   WARNING: Unmatched element: <xsl:value-of select="name()"/>
+  </xsl:message>
+
+  <xsl:apply-templates/>
+ </xsl:template>
+
+  <xsl:template match="gasdefinitions|u:gasdefinitions">
+    <xsl:for-each select="u:mix|mix">
+      <cylinder>
+        <xsl:attribute name="description">
+          <xsl:value-of select="u:name|name"/>
+        </xsl:attribute>
+
+        <xsl:attribute name="o2">
+          <xsl:call-template name="gasConvert">
+            <xsl:with-param name="mix">
+              <xsl:value-of select="u:o2|o2"/>
+            </xsl:with-param>
+          </xsl:call-template>
+        </xsl:attribute>
+
+        <xsl:attribute name="he">
+          <xsl:call-template name="gasConvert">
+            <xsl:with-param name="mix">
+              <xsl:value-of select="u:he|he"/>
+            </xsl:with-param>
+          </xsl:call-template>
+        </xsl:attribute>
+      </cylinder>
+    </xsl:for-each>
+  </xsl:template>
+
+  <xsl:template match="u:dive|dive">
+    <dive>
+      <xsl:choose>
+        <xsl:when test="date != ''">
+          <xsl:attribute name="date">
+            <xsl:value-of select="concat(date/year,'-',format-number(date/month, '00'), '-', format-number(date/day, '00'))"/>
+          </xsl:attribute>
+          <xsl:attribute name="time">
+            <xsl:value-of select="concat(format-number(time/hour, '00'), ':', format-number(time/minute, '00'))"/>
+          </xsl:attribute>
+        </xsl:when>
+        <xsl:when test="u:informationbeforedive/u:datetime != ''">
+          <xsl:attribute name="date">
+            <xsl:value-of select="u:informationbeforedive/u:datetime"/>
+          </xsl:attribute>
+        </xsl:when>
+      </xsl:choose>
+
+      <xsl:for-each select="lowesttemperature|informationafterdive/lowesttemperature|u:lowesttemperature|u:informationafterdive/u:lowesttemperature">
+        <temperature>
+          <xsl:attribute name="water">
+            <xsl:value-of select="concat(format-number(.- 273.15, '0.0'), ' C')"/>
+          </xsl:attribute>
+        </temperature>
+      </xsl:for-each>
+
+      <xsl:apply-templates select="/uddf/gasdefinitions|/u:uddf/u:gasdefinitions"/>
+      <depth>
+        <xsl:for-each select="greatestdepth|informationafterdive/greatestdepth|u:greatestdepth|u:informationafterdive/u:greatestdepth">
+          <xsl:attribute name="max">
+            <xsl:value-of select="concat(., ' m')"/>
+          </xsl:attribute>
+        </xsl:for-each>
+        <xsl:for-each select="averagedepth|informationafterdive/averagedepth|u:averagedepth|u:informationafterdive/u:averagedepth">
+          <xsl:attribute name="mean">
+            <xsl:value-of select="concat(., ' m')"/>
+          </xsl:attribute>
+        </xsl:for-each>
+      </depth>
+
+      <xsl:for-each select="samples/waypoint/switchmix|u:samples/u:waypoint/u:switchmix">
+  			<!-- Index to lookup gas per cent -->
+        <xsl:variable name="idx">
+          <xsl:value-of select="./@ref"/>
+        </xsl:variable>
+
+        <event name="gaschange" type="11">
+          <xsl:attribute name="time">
+            <xsl:call-template name="timeConvert">
+              <xsl:with-param name="timeSec">
+                <xsl:value-of select="preceding-sibling::divetime|preceding-sibling::u:divetime"/>
+              </xsl:with-param>
+            </xsl:call-template>
+          </xsl:attribute>
+
+          <xsl:attribute name="value">
+            <xsl:call-template name="gasConvert">
+              <xsl:with-param name="mix">
+                <xsl:value-of select="//gasdefinitions/mix[@id=$idx]/o2|//u:gasdefinitions/u:mix[@id=$idx]/u:o2"/>
+              </xsl:with-param>
+            </xsl:call-template>
+          </xsl:attribute>
+        </event>
+      </xsl:for-each>
+
+      <xsl:for-each select="samples/waypoint|u:samples/u:waypoint">
+        <sample>
+          <xsl:attribute name="time">
+            <xsl:call-template name="timeConvert">
+              <xsl:with-param name="timeSec">
+                <xsl:value-of select="divetime|u:divetime"/>
+              </xsl:with-param>
+            </xsl:call-template>
+          </xsl:attribute>
+
+          <xsl:if test="depth != ''">
+            <xsl:attribute name="depth">
+              <xsl:value-of select="concat(depth, ' m')"/>
+            </xsl:attribute>
+          </xsl:if>
+          <xsl:if test="u:depth != ''">
+            <xsl:attribute name="depth">
+              <xsl:value-of select="concat(u:depth, ' m')"/>
+            </xsl:attribute>
+          </xsl:if>
+
+          <xsl:if test="temperature != ''">
+            <xsl:attribute name="temperature">
+              <xsl:value-of select="concat(format-number(temperature - 273.15, '0.0'), ' C')"/>
+            </xsl:attribute>
+          </xsl:if>
+
+          <xsl:if test="u:temperature != ''">
+            <xsl:attribute name="temperature">
+              <xsl:value-of select="concat(format-number(u:temperature - 273.15, '0.0'), ' C')"/>
+            </xsl:attribute>
+          </xsl:if>
+
+          <!-- otu -->
+          <xsl:if test="cns > 0">
+            <xsl:attribute name="cns">
+              <xsl:value-of select="concat(cns, ' C')"/>
+            </xsl:attribute>
+          </xsl:if>
+
+          <xsl:if test="u:cns > 0">
+            <xsl:attribute name="cns">
+              <xsl:value-of select="concat(u:cns, ' C')"/>
+            </xsl:attribute>
+          </xsl:if>
+        </sample>
+      </xsl:for-each>
+    </dive>
+  </xsl:template>
+
+  <!-- convert time in seconds to minutes:seconds -->
+  <xsl:template name="timeConvert">
+    <xsl:param name="timeSec"/>
+    <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 gas -->
+  <xsl:template name="gasConvert">
+    <xsl:param name="mix"/>
+    <xsl:if test="$mix != ''">
+      <xsl:choose>
+        <xsl:when test="$mix >= 0">
+          <xsl:choose>
+            <xsl:when test="$mix > 1">
+              <xsl:value-of select="concat($mix, '%')"/>
+            </xsl:when>
+            <xsl:otherwise>
+              <xsl:value-of select="concat($mix * 100, '%')"/>
+            </xsl:otherwise>
+          </xsl:choose>
+        </xsl:when>
+        <xsl:otherwise>
+          <xsl:value-of select="$mix"/>
+        </xsl:otherwise>
+      </xsl:choose>
+    </xsl:if>
+  </xsl:template>
+  <!-- end convert time -->
+
+</xsl:stylesheet>
-- 
1.7.9.5



More information about the subsurface mailing list