csv XSL 1.0逗号分隔行转换为xml

xfb7svmp  于 2023-04-09  发布在  其他
关注(0)|答案(1)|浏览(131)

我有如下的txt文件:

<raw>
Value1,Value2,Value3,Value4,Value5,"Paris,France"
</raw>

并想转变为

<raw>
<column>Value1</column>
<column>Value2</column>
<column>Value3</column>
<column>Value4</column>
<column>Value5</column>
<column>Paris,France</column>
</raw>

我刚开始学习xslt,我不知道如何通过分隔符分割行和转义双引号。这是我到目前为止所掌握的。

<?xml version="1.0" encoding="utf-8"?>
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns:lxslt="http://xml.apache.org/xslt" xmlns:xalan="http://xml.apache.org/xalan" xmlns:redirect="org.apache.xalan.lib.Redirect" extension-element-prefixes="redirect" exclude-result-prefixes="xalan">
    <xsl:template match="RawData">
        <RawData>
            <xsl:for-each select="row">
                <column><xsl:value-of select="row/column[1]"/></column>
                <column><xsl:value-of select="row/column[2]"/></column>
                <column><xsl:value-of select="row/column[3]"/></column>
            </xsl:for-each>
        </RawData>
    </xsl:template>
</xsl:stylesheet>
z0qdvdin

z0qdvdin1#

这不是一个小问题--当然不适合刚开始学习XSLT的人。
我会这样做:

XSLT 1.0

<xsl:stylesheet version="1.0" 
xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output method="xml" version="1.0" encoding="UTF-8" indent="yes"/>

<xsl:template match="/">
    <result>
        <xsl:call-template name="tokenize">
            <xsl:with-param name="text" select="normalize-space(raw)"/>
        </xsl:call-template>
    </result>
</xsl:template>

<xsl:template name="tokenize">
    <xsl:param name="text"/>
    <xsl:param name="delimiter" select="','"/>
    <xsl:variable name="token">
        <xsl:choose>
            <xsl:when test="substring($text, 1, 1) = '&quot;'">
                 <xsl:value-of select="substring-before(substring-after($text, '&quot;'), '&quot;')"/>
            </xsl:when>
            <xsl:otherwise>
                <xsl:value-of select="substring-before(concat($text, $delimiter), $delimiter)"/>
            </xsl:otherwise>
        </xsl:choose>
    </xsl:variable>
    <xsl:if test="normalize-space($token)">         
        <token>
            <xsl:value-of select="$token"/>
        </token>
    </xsl:if>
    <xsl:if test="contains($text, $delimiter)">
        <!-- recursive call -->
        <xsl:call-template name="tokenize">
            <xsl:with-param name="text">
                <xsl:choose>
                    <xsl:when test="substring($text, 1, 1) = '&quot;'">
                         <xsl:value-of select="substring-after(substring-after($text, '&quot;'), '&quot;')"/>
                    </xsl:when>
                    <xsl:otherwise>
                        <xsl:value-of select="substring-after($text, $delimiter)"/>
                    </xsl:otherwise>
                </xsl:choose>
            </xsl:with-param>
        </xsl:call-template>
    </xsl:if>
</xsl:template>

</xsl:stylesheet>

请注意,这并不处理转义引号。
有一些替代方法建议here;我还没测试过

相关问题