2016-05-13 57 views
0

背景:CSV與XSLT 2.0 XML轉換 - 跳過空行

我有一個CSV文件輸入從我轉換爲XML的外部資源。 XML然後用於更多的轉換工作。 我用來將CSV轉換爲XML的函數來自Andrew J. Welch:http://andrewjwelch.com/code/xslt/csv/csv-to-xml_v2.html

<xsl:variable name="KortingOverzicht"> 
      <xsl:call-template name="Kortingoverzicht"> 
       <xsl:with-param name="pathToCSV" select="'discountoverview.csv'"/> 
      </xsl:call-template> 
</xsl:variable> 

<xsl:function name="fn:getTokens" as="xs:string+"> 
     <xsl:param name="str" as="xs:string"/> 
     <xsl:analyze-string regex="(&quot;[^&quot;]*&quot;)+" select="$str"> 
      <xsl:matching-substring> 
       <xsl:sequence 
        select="replace(., &quot;^&quot;&quot;|&quot;&quot;$|(&quot;&quot;)&quot;&quot;&quot;, &quot;$1&quot;)" 
       /> 
      </xsl:matching-substring> 
      <xsl:non-matching-substring> 
       <xsl:for-each select="tokenize(., '\s*,\s*')"> 
        <xsl:sequence select="."/> 
       </xsl:for-each> 
      </xsl:non-matching-substring> 
     </xsl:analyze-string> 
    </xsl:function> 

    <xsl:template name="Kortingoverzicht"> 
      <xsl:param name="pathToCSV"/> 

      <xsl:variable name="XMLkorting"> 
       <xsl:choose> 
        <xsl:when test="unparsed-text-available($pathToCSV)"> 
         <xsl:variable name="csv" select="unparsed-text($pathToCSV)"/> 
         <xsl:variable name="lines" select="tokenize($csv, '&#xa;')" as="xs:string+"/> 
         <xsl:variable name="elemNames" select="fn:getTokens($lines[1])" as="xs:string+"/> 
         <xsl:element name="Kortingoverzicht"> 
          <xsl:for-each select="$lines[position() > 1]"> 
           <Korting> 
            <xsl:variable name="lineItems" select="fn:getTokens(.)" 
             as="xs:string+"/> 

            <xsl:for-each select="$elemNames"> 
             <xsl:variable name="pos" select="position()"/> 
             <elem name="{.}"> 
              <xsl:value-of select="$lineItems[$pos]"/> 
             </elem> 
            </xsl:for-each> 
           </Korting> 
          </xsl:for-each> 
         </xsl:element> 
        </xsl:when> 
        <xsl:otherwise> 
         <xsl:text>Bestand niet gevonden : </xsl:text> 
         <xsl:value-of select="$pathToCSV"/> 
        </xsl:otherwise> 
       </xsl:choose> 
      </xsl:variable> 

      <xsl:element name="Kortingoverzicht"> 
       <xsl:for-each select="$XMLkorting/Kortingoverzicht/Korting"> 
        <xsl:element name="Korting"> 
         <xsl:element name="brandid"> 
          <xsl:value-of select="substring-before(elem,';')"/> 
         </xsl:element> 

         <xsl:element name="brandname"> 
          <xsl:value-of select="substring-before(substring-after(elem,';'),';')"/> 
         </xsl:element> 

         <xsl:element name="discount"> 
          <xsl:value-of select="substring-after(substring-after(elem,';'),';')"/> 
         </xsl:element> 
        </xsl:element> 
       </xsl:for-each> 
      </xsl:element> 
     </xsl:template> 

問題:

CSV文件每日更新,是 「按原樣」。該文件最後總是包含一個空行。該函數不喜歡,並給出一個錯誤:空序列不允許作爲函數fn的結果:getTokens()

爲了解決這個我總是除去用手空行。但是現在我希望整個XSLT能夠自動運行,並且最好不必手動刪除線條。

問題:

有沒有辦法改變函數或調用它,所以它會跳過任何空行?

回答

3

如果將<xsl:variable name="lines" select="tokenize($csv, '&#xa;')" as="xs:string+"/>更改爲<xsl:variable name="lines" select="tokenize($csv, '&#xa;')[normalize-space()]" as="xs:string+"/>,則會忽略空行。

+0

那簡單嗎?我想/想着各種奇怪的解決方案......我會試試這個,謝謝。 –

+0

完美的作品!謝謝你,馬丁。 –