subsurface/xslt/subsurfacecsv.xslt
Miika Turkia 182ea3ea6c Support for multi-line notes on SubsurfaceCSV import
This patch only implements the feature, indentation fix is to follow.
This ensures that the actual change can be more easily reviewed.

Signed-off-by: Miika Turkia <miika.turkia@gmail.com>
Signed-off-by: Dirk Hohndel <dirk@hohndel.org>
2015-01-05 09:13:35 -08:00

447 lines
16 KiB
HTML

<?xml version="1.0"?>
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="1.0">
<xsl:include href="commonTemplates.xsl"/>
<xsl:strip-space elements="*"/>
<xsl:param name="separatorIndex" select="separatorIndex"/>
<xsl:param name="units" select="units"/>
<xsl:output method="xml" encoding="utf-8" indent="yes"/>
<xsl:variable name="lf"><xsl:text>
</xsl:text></xsl:variable>
<xsl:variable name="fs">
<xsl:choose>
<xsl:when test="$separatorIndex = 0"><xsl:text> </xsl:text></xsl:when>
<xsl:when test="$separatorIndex = 2"><xsl:text>;</xsl:text></xsl:when>
<xsl:otherwise><xsl:text>,</xsl:text></xsl:otherwise>
</xsl:choose>
</xsl:variable>
<xsl:template match="/">
<divelog program="subsurface-import" version="2">
<dives>
<xsl:call-template name="printLine">
<xsl:with-param name="line" select="substring-before(substring-after(//SubsurfaceCSV, $lf), $lf)"/>
<xsl:with-param name="remaining" select="substring-after(substring-after(//SubsurfaceCSV, $lf), $lf)"/>
</xsl:call-template>
</dives>
</divelog>
</xsl:template>
<xsl:template name="printLine">
<xsl:param name="line"/>
<xsl:param name="remaining"/>
<xsl:call-template name="printFields">
<xsl:with-param name="line" select="$line"/>
<xsl:with-param name="remaining" select="$remaining"/>
</xsl:call-template>
<xsl:if test="$remaining != ''">
<xsl:call-template name="printLine">
<xsl:with-param name="line" select="substring-before($remaining, $lf)"/>
<xsl:with-param name="remaining" select="substring-after($remaining, $lf)"/>
</xsl:call-template>
</xsl:if>
</xsl:template>
<xsl:template name="printFields">
<xsl:param name="line"/>
<xsl:param name="remaining"/>
<xsl:variable name="number">
<xsl:call-template name="getFieldByIndex">
<xsl:with-param name="index" select="0"/>
<xsl:with-param name="line" select="$line"/>
</xsl:call-template>
</xsl:variable>
<xsl:if test="$number >= 0">
<dive>
<xsl:attribute name="date">
<xsl:call-template name="getFieldByIndex">
<xsl:with-param name="index" select="1"/>
<xsl:with-param name="line" select="$line"/>
</xsl:call-template>
</xsl:attribute>
<xsl:attribute name="time">
<xsl:call-template name="getFieldByIndex">
<xsl:with-param name="index" select="2"/>
<xsl:with-param name="line" select="$line"/>
</xsl:call-template>
</xsl:attribute>
<xsl:attribute name="number">
<xsl:value-of select="$number"/>
</xsl:attribute>
<xsl:attribute name="duration">
<xsl:call-template name="getFieldByIndex">
<xsl:with-param name="index" select="3"/>
<xsl:with-param name="line" select="$line"/>
</xsl:call-template>
</xsl:attribute>
<xsl:attribute name="tags">
<xsl:call-template name="getFieldByIndex">
<xsl:with-param name="index" select="22"/>
<xsl:with-param name="line" select="$line"/>
</xsl:call-template>
</xsl:attribute>
<xsl:variable name="rating">
<xsl:call-template name="getFieldByIndex">
<xsl:with-param name="index" select="18"/>
<xsl:with-param name="line" select="$line"/>
</xsl:call-template>
</xsl:variable>
<xsl:if test="$rating != ''">
<xsl:attribute name="rating">
<xsl:value-of select="$rating"/>
</xsl:attribute>
</xsl:if>
<xsl:variable name="visibility">
<xsl:call-template name="getFieldByIndex">
<xsl:with-param name="index" select="19"/>
<xsl:with-param name="line" select="$line"/>
</xsl:call-template>
</xsl:variable>
<xsl:if test="$visibility != ''">
<xsl:attribute name="visibility">
<xsl:value-of select="$visibility"/>
</xsl:attribute>
</xsl:if>
<divecomputerid deviceid="ffffffff" model="csv" />
<depth>
<xsl:variable name="max">
<xsl:call-template name="getFieldByIndex">
<xsl:with-param name="index" select="4"/>
<xsl:with-param name="line" select="$line"/>
</xsl:call-template>
</xsl:variable>
<xsl:variable name="mean">
<xsl:call-template name="getFieldByIndex">
<xsl:with-param name="index" select="5"/>
<xsl:with-param name="line" select="$line"/>
</xsl:call-template>
</xsl:variable>
<xsl:if test="$max != ''">
<xsl:attribute name="max">
<xsl:choose>
<xsl:when test="$units = 0">
<xsl:value-of select="$max"/>
</xsl:when>
<xsl:otherwise>
<xsl:value-of select="concat(format-number((substring-before($max, ' ') * 0.3048), '#.##'), ' m')"/>
</xsl:otherwise>
</xsl:choose>
</xsl:attribute>
</xsl:if>
<xsl:if test="$mean != ''">
<xsl:attribute name="mean">
<xsl:choose>
<xsl:when test="$units = 0">
<xsl:value-of select="$mean"/>
</xsl:when>
<xsl:otherwise>
<xsl:value-of select="concat(format-number((substring-before($mean, ' ') * 0.3048), '#.##'), ' m')"/>
</xsl:otherwise>
</xsl:choose>
</xsl:attribute>
</xsl:if>
</depth>
<divetemperature>
<xsl:variable name="air">
<xsl:call-template name="getFieldByIndex">
<xsl:with-param name="index" select="6"/>
<xsl:with-param name="line" select="$line"/>
</xsl:call-template>
</xsl:variable>
<xsl:variable name="water">
<xsl:call-template name="getFieldByIndex">
<xsl:with-param name="index" select="7"/>
<xsl:with-param name="line" select="$line"/>
</xsl:call-template>
</xsl:variable>
<xsl:if test="$air != ''">
<xsl:attribute name="air">
<xsl:choose>
<xsl:when test="$units = 0">
<xsl:value-of select="$air"/>
</xsl:when>
<xsl:otherwise>
<xsl:value-of select="concat(format-number((substring-before($air, ' ') - 32) * 5 div 9, '0.0'), ' C')"/>
</xsl:otherwise>
</xsl:choose>
</xsl:attribute>
</xsl:if>
<xsl:if test="$water != ''">
<xsl:attribute name="water">
<xsl:choose>
<xsl:when test="$units = 0">
<xsl:value-of select="$water"/>
</xsl:when>
<xsl:otherwise>
<xsl:value-of select="concat(format-number((substring-before($water, ' ') - 32) * 5 div 9, '0.0'), ' C')"/>
</xsl:otherwise>
</xsl:choose>
</xsl:attribute>
</xsl:if>
</divetemperature>
<cylinder>
<xsl:variable name="size">
<xsl:call-template name="getFieldByIndex">
<xsl:with-param name="index" select="8"/>
<xsl:with-param name="line" select="$line"/>
</xsl:call-template>
</xsl:variable>
<xsl:variable name="start">
<xsl:call-template name="getFieldByIndex">
<xsl:with-param name="index" select="9"/>
<xsl:with-param name="line" select="$line"/>
</xsl:call-template>
</xsl:variable>
<xsl:variable name="end">
<xsl:call-template name="getFieldByIndex">
<xsl:with-param name="index" select="10"/>
<xsl:with-param name="line" select="$line"/>
</xsl:call-template>
</xsl:variable>
<xsl:variable name="o2">
<xsl:call-template name="getFieldByIndex">
<xsl:with-param name="index" select="11"/>
<xsl:with-param name="line" select="$line"/>
</xsl:call-template>
</xsl:variable>
<xsl:variable name="he">
<xsl:call-template name="getFieldByIndex">
<xsl:with-param name="index" select="12"/>
<xsl:with-param name="line" select="$line"/>
</xsl:call-template>
</xsl:variable>
<!-- ALxxx -> xxx cuft at 3000 psi
LPxxx -> xxx cuft at 2400 psi
HPxxx -> xxx cuft at 3440 psi -->
<xsl:if test="$size != ''">
<xsl:attribute name="size">
<xsl:choose>
<xsl:when test="substring($size, 1, 2) = 'AL'">
<xsl:value-of select="format-number((translate($size, translate($size, '0123456789', ''), '') * 14.7 div 3000) div 0.035315, '#.#')"/>
</xsl:when>
<xsl:when test="substring($size, 1, 2) = 'LP'">
<xsl:value-of select="format-number((translate($size, translate($size, '0123456789', ''), '') * 14.7 div 2400) div 0.035315, '#.#')"/>
</xsl:when>
<xsl:when test="substring($size, 1, 2) = 'HP'">
<xsl:value-of select="format-number((translate($size, translate($size, '0123456789', ''), '') * 14.7 div 3440) div 0.035315, '#.#')"/>
</xsl:when>
<xsl:otherwise>
<xsl:value-of select="$size"/>
</xsl:otherwise>
</xsl:choose>
</xsl:attribute>
</xsl:if>
<xsl:if test="substring($size, 1, 2) = 'AL' or substring($size, 1, 2) = 'LP' or substring($size, 1, 2) = 'HP'">
<xsl:attribute name="description">
<xsl:value-of select="$size"/>
</xsl:attribute>
</xsl:if>
<xsl:if test="$start != ''">
<xsl:attribute name="start">
<xsl:choose>
<xsl:when test="$units = 0">
<xsl:value-of select="$start"/>
</xsl:when>
<xsl:otherwise>
<xsl:value-of select="concat(format-number((substring-before($start, ' ') div 14.5037738007), '#'), ' bar')"/>
</xsl:otherwise>
</xsl:choose>
</xsl:attribute>
</xsl:if>
<xsl:if test="$end != ''">
<xsl:attribute name="end">
<xsl:choose>
<xsl:when test="$units = 0">
<xsl:value-of select="$end"/>
</xsl:when>
<xsl:otherwise>
<xsl:value-of select="concat(format-number((substring-before($end, ' ') div 14.5037738007), '#'), ' bar')"/>
</xsl:otherwise>
</xsl:choose>
</xsl:attribute>
</xsl:if>
<xsl:if test="$o2 != ''">
<xsl:attribute name="o2">
<xsl:value-of select="$o2"/>
</xsl:attribute>
</xsl:if>
<xsl:if test="$he != ''">
<xsl:attribute name="he">
<xsl:value-of select="$he"/>
</xsl:attribute>
</xsl:if>
</cylinder>
<location>
<xsl:variable name="gps">
<xsl:call-template name="getFieldByIndex">
<xsl:with-param name="index" select="14"/>
<xsl:with-param name="line" select="$line"/>
</xsl:call-template>
</xsl:variable>
<xsl:variable name="location">
<xsl:call-template name="getFieldByIndex">
<xsl:with-param name="index" select="13"/>
<xsl:with-param name="line" select="$line"/>
</xsl:call-template>
</xsl:variable>
<xsl:if test="$gps != ''">
<xsl:attribute name="gps">
<xsl:value-of select="$gps"/>
</xsl:attribute>
</xsl:if>
<xsl:if test="$location != ''">
<xsl:value-of select="$location"/>
</xsl:if>
</location>
<xsl:variable name="dm">
<xsl:call-template name="getFieldByIndex">
<xsl:with-param name="index" select="15"/>
<xsl:with-param name="line" select="$line"/>
</xsl:call-template>
</xsl:variable>
<xsl:if test="$dm != ''">
<divemaster>
<xsl:value-of select="$dm"/>
</divemaster>
</xsl:if>
<xsl:variable name="buddy">
<xsl:call-template name="getFieldByIndex">
<xsl:with-param name="index" select="16"/>
<xsl:with-param name="line" select="$line"/>
</xsl:call-template>
</xsl:variable>
<xsl:if test="$buddy != ''">
<buddy>
<xsl:value-of select="$buddy"/>
</buddy>
</xsl:if>
<xsl:variable name="suit">
<xsl:call-template name="getFieldByIndex">
<xsl:with-param name="index" select="17"/>
<xsl:with-param name="line" select="$line"/>
</xsl:call-template>
</xsl:variable>
<xsl:if test="$suit != ''">
<suit>
<xsl:value-of select="$suit"/>
</suit>
</xsl:if>
<xsl:variable name="notes">
<xsl:call-template name="getFieldByIndex">
<xsl:with-param name="index" select="20"/>
<xsl:with-param name="line" select="$line"/>
<xsl:with-param name="remaining" select="$remaining"/>
</xsl:call-template>
</xsl:variable>
<xsl:if test="$notes != ''">
<notes>
<xsl:value-of select="$notes"/>
</notes>
</xsl:if>
<xsl:variable name="weight">
<xsl:call-template name="getFieldByIndex">
<xsl:with-param name="index" select="21"/>
<xsl:with-param name="line" select="$line"/>
</xsl:call-template>
</xsl:variable>
<xsl:if test="$weight != ''">
<weightsystem description="unknown">
<xsl:attribute name="weight">
<xsl:choose>
<xsl:when test="$units = 0">
<xsl:value-of select="$weight"/>
</xsl:when>
<xsl:otherwise>
<xsl:value-of select="concat(format-number((substring-before($weight, ' ') * 0.453592), '#.##'), ' kg')"/>
</xsl:otherwise>
</xsl:choose>
</xsl:attribute>
</weightsystem>
</xsl:if>
</dive>
</xsl:if>
</xsl:template>
<xsl:template name="getFieldByIndex">
<xsl:param name="index"/>
<xsl:param name="line"/>
<xsl:param name="remaining"/>
<xsl:choose>
<xsl:when test="$index > 0">
<xsl:choose>
<xsl:when test="substring($line, 1, 1) = '&quot;'">
<xsl:call-template name="getFieldByIndex">
<xsl:with-param name="index" select="$index -1"/>
<xsl:with-param name="line" select="substring-after($line, $fs)"/>
<xsl:with-param name="remaining" select="$remaining"/>
</xsl:call-template>
</xsl:when>
<xsl:otherwise>
<xsl:call-template name="getFieldByIndex">
<xsl:with-param name="index" select="$index -1"/>
<xsl:with-param name="line" select="substring-after($line, $fs)"/>
<xsl:with-param name="remaining" select="$remaining"/>
</xsl:call-template>
</xsl:otherwise>
</xsl:choose>
</xsl:when>
<xsl:otherwise>
<xsl:choose>
<xsl:when test="substring($line, 1, 1) = '&quot;'">
<xsl:choose>
<xsl:when test="substring-before($line,'&quot;$fs') != ''">
<xsl:value-of select="substring-before($line,'&quot;$fs')"/>
</xsl:when>
<xsl:otherwise>
<xsl:choose>
<xsl:when test="substring-after(substring-after($line, '&quot;'), '&quot;') = ''">
<xsl:value-of select="concat(substring-after($line, '&quot;'), $lf, substring-before($remaining, '&quot;'))"/>
</xsl:when>
<xsl:otherwise>
<xsl:value-of select="substring-before(substring-after($line, '&quot;'), '&quot;')"/>
</xsl:otherwise>
</xsl:choose>
</xsl:otherwise>
</xsl:choose>
</xsl:when>
<xsl:otherwise>
<xsl:choose>
<xsl:when test="substring-before($line,$fs) != ''">
<xsl:value-of select="substring-before($line,$fs)"/>
</xsl:when>
<xsl:otherwise>
<xsl:if test="substring-after($line, $fs) = ''">
<xsl:value-of select="$line"/>
</xsl:if>
</xsl:otherwise>
</xsl:choose>
</xsl:otherwise>
</xsl:choose>
</xsl:otherwise>
</xsl:choose>
</xsl:template>
</xsl:stylesheet>