[PATCH] MacDive import improvement

Miika Turkia miika.turkia at gmail.com
Wed Feb 27 08:05:40 PST 2013


MacDive reports non-existent values as zero and in Imperial units it
would be 32F. This patch will try to make an educated guess whether we
have the proper temperature and pressure readings and ignore the zero
fields if it seems that there are no real samples from the dive
computer.

Signed-off-by: Miika Turkia <miika.turkia at gmail.com>
---
 xslt/MacDive.xslt |   91 +++++++++++++++++++++++++++++++++++++++++++----------
 1 file changed, 74 insertions(+), 17 deletions(-)

diff --git a/xslt/MacDive.xslt b/xslt/MacDive.xslt
index 35a5a78..f3c8738 100644
--- a/xslt/MacDive.xslt
+++ b/xslt/MacDive.xslt
@@ -30,6 +30,19 @@
 
   <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>
@@ -122,12 +135,14 @@
         </xsl:for-each>
       </location>
 
-      <xsl:if test="sitelat != ''">
+      <!-- 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 != ''">
+      <xsl:if test="siteLat != 0">
         <gps>
           <xsl:value-of select="concat(siteLat, ' ', siteLon)"/>
         </gps>
@@ -163,7 +178,7 @@
               <xsl:value-of select="concat(helium, '%')"/>
             </xsl:attribute>
           </xsl:if>
-          <xsl:if test="pressureStart != ''">
+          <xsl:if test="pressureStart > 0">
             <xsl:attribute name="start">
               <xsl:call-template name="pressureConvert">
                 <xsl:with-param name="number" select="pressureStart"/>
@@ -171,7 +186,7 @@
               </xsl:call-template>
             </xsl:attribute>
           </xsl:if>
-          <xsl:if test="pressureEnd != ''">
+          <xsl:if test="pressureEnd > 0">
             <xsl:attribute name="end">
               <xsl:call-template name="pressureConvert">
                 <xsl:with-param name="number" select="pressureEnd"/>
@@ -179,7 +194,7 @@
               </xsl:call-template>
             </xsl:attribute>
           </xsl:if>
-          <xsl:if test="tankSize != ''">
+          <xsl:if test="tankSize > 0">
             <xsl:attribute name="size">
               <xsl:call-template name="sizeConvert">
                 <xsl:with-param name="singleSize" select="tankSize"/>
@@ -189,7 +204,7 @@
               </xsl:call-template>
             </xsl:attribute>
           </xsl:if>
-          <xsl:if test="workingPressure != ''">
+          <xsl:if test="workingPressure > 0">
             <xsl:attribute name="workpressure">
               <xsl:call-template name="pressureConvert">
                 <xsl:with-param name="number" select="workingPressure"/>
@@ -206,37 +221,63 @@
       </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:attribute name="air">
+          <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:attribute>
+          </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:attribute name="water">
+          <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:attribute>
+          </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:attribute name="air">
+          <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:attribute>
+          </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:attribute name="water">
+          <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:attribute>
+          </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>
 
@@ -290,7 +331,7 @@
               <xsl:with-param name="units" select="$units"/>
             </xsl:call-template>
           </xsl:attribute>
-          <xsl:if test="pressure != ''">
+          <xsl:if test="pressure != '' and $pressureSamples > 0">
             <xsl:attribute name="pressure">
               <xsl:call-template name="pressureConvert">
                 <xsl:with-param name="number" select="pressure"/>
@@ -298,7 +339,7 @@
               </xsl:call-template>
             </xsl:attribute>
           </xsl:if>
-          <xsl:if test="temperature != ''">
+          <xsl:if test="temperature != '' and $temperatureSamples > 0">
             <xsl:attribute name="temp">
               <xsl:call-template name="tempConvert">
                 <xsl:with-param name="temp" select="temperature"/>
@@ -393,7 +434,7 @@
   </xsl:template>
   <!-- end convert pressure -->
 
-  <!-- convert temperature to C -->
+  <!-- convert temperature from F to C -->
   <xsl:template name="tempConvert">
     <xsl:param name="temp"/>
     <xsl:param name="units"/>
@@ -459,4 +500,20 @@
   </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[. > 0])"/>
+  </xsl:template>
+
 </xsl:stylesheet>
-- 
1.7.9.5



More information about the subsurface mailing list