2016-05-13 1 views
0

фона:CSV для преобразования XML с помощью XSLT 2.0 - Пропуск пустых строк

У меня есть стандартный файл 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

Это работает отлично! Спасибо, Мартин. –

 Смежные вопросы

  • Нет связанных вопросов^_^