我正在尝试使用XSLT将XML转换为CSV。我在这个网站上看过很多类似的帖子,但是想提一下我在代码中看到的具体要求和问题。
这是我精心构建的XML文件内容。请注意,我将这个XML作为字符串从数据库中获取,因此它没有格式化。
XML文件
<myxml ver="1.0"><name>smile</name><email>test@gmail.com</email><phone_number/><job_title>Engineer</job_title><company_name>Stack Overflow</company_name><submission-datestamp>3/14/11 8:29 PM</submission-datestamp></myxml>
这是XSLT文件
<?xml version="1.0" encoding="ISO-8859-1"?>
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output method="text"/>
<xsl:template match="myxml">
<xsl:for-each select="*" >
<xsl:if test="position() != last()">
<xsl:value-of select="normalize-space(.)"/>,
</xsl:if>
</xsl:for-each>
</xsl:template>
</xsl:stylesheet>
我的格式低于CSV格式:
smile,
test@gmail.com,
,
Engineer,
Stack Overflow,
3/14/11 8:29 PM
要求是:
逗号分隔列表,如
smiletest @ gmail.com,EngineerStack Overflow,3/14/11 8:29 PM
你可以帮我修改我的代码吗?问题出在XSLT文件中。
答案 0 :(得分:2)
您获得了额外的回车,因为您在模板内部有混合内容。样式表假定逗号后面的空格很重要。您可以将文字放在<xsl:text>
内来阻止这种情况。这告诉样式表哪个文本明确是输出的一部分,所以如果没有剩下的东西而是空格,那么它被认为是无关紧要的。
我使用xsl:apply-templates
而不是xsl:for-each
稍微修改了样式表以更多地使用“推送样式”样式表,并且还在每行的末尾添加了回车符:
<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
version="1.0">
<xsl:output method="text"/>
<xsl:template match="/">
<xsl:apply-templates mode="header"/>
<xsl:apply-templates />
</xsl:template>
<xsl:template match="myxml/*" mode="header">
<xsl:value-of select="local-name()"/>
<xsl:choose>
<xsl:when test="position() = last()">
<xsl:text>
</xsl:text>
</xsl:when>
<xsl:otherwise>
<xsl:text>,</xsl:text>
</xsl:otherwise>
</xsl:choose>
</xsl:template>
<xsl:template match="myxml/*">
<xsl:value-of select="normalize-space(.)"/>
<xsl:choose>
<xsl:when test="position() = last()">
<xsl:text>
</xsl:text>
</xsl:when>
<xsl:otherwise>
<xsl:text>,</xsl:text>
</xsl:otherwise>
</xsl:choose>
</xsl:template>
</xsl:stylesheet>
产生以下输出:
name,email,phone_number,job_title,company_name,submission-datestamp
smile,test@gmail.com,,Engineer,Stack Overflow,3/14/11 8:29 PM