【问题标题】:CSV to XML conversion with XSLT 2.0 - Skip empty lines使用 XSLT 2.0 将 CSV 转换为 XML - 跳过空行
【发布时间】:2023-04-09 01:04:01
【问题描述】:

背景:

我有一个 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 自动运行,最好不必手动删除行。

问题:

有没有办法改变函数或对它的调用,让它跳过任何空行?

【问题讨论】:

    标签: xml csv xslt xslt-2.0


    【解决方案1】:

    如果您将&lt;xsl:variable name="lines" select="tokenize($csv, '&amp;#xa;')" as="xs:string+"/&gt; 更改为&lt;xsl:variable name="lines" select="tokenize($csv, '&amp;#xa;')[normalize-space()]" as="xs:string+"/&gt;,则会忽略空行。

    【讨论】:

    • 这么简单?我正在尝试/思考各种奇怪的解决方案...我会尝试一下,谢谢。
    猜你喜欢
    • 2013-05-22
    • 1970-01-01
    • 2019-02-02
    • 2017-05-23
    • 2011-10-28
    相关资源
    最近更新 更多