我有一个如下的文本文件:
<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>
这不是一个微不足道的问题——当然不适合刚开始学习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) = '"'">
<xsl:value-of select="substring-before(substring-after($text, '"'), '"')"/>
</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) = '"'">
<xsl:value-of select="substring-after(substring-after($text, '"'), '"')"/>
</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>
注意,这并不处理转义引号。
这里有一些可供选择的方法;我还没有测试过。