【问题标题】:Unable to embed delimiter when converting XML to CSV using XSLT using Java使用 Java 使用 XSLT 将 XML 转换为 CSV 时无法嵌入分隔符
【发布时间】:2013-04-16 00:44:09
【问题描述】:

我正在尝试使用 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,2011 年 3 月 14 日晚上 8 点 29 分

你能帮我修复我的代码吗?问题出在 XSLT 文件中。

【问题讨论】:

  • 好吧,您在源中没有名称为 catalogcd 的元素,因此您的 XSLT 不匹配任何内容。

标签: java xml xslt csv


【解决方案1】:

您得到了额外的回车,因为模板内有混合内容。样式表假定逗号后面的空格很重要。您可以通过将文本放在&lt;xsl:text&gt; 中来防止这种情况。这告诉样式表哪些文本是输出的明确部分,因此如果除了空格之外没有其他内容,则假定它是无关紧要的。

我使用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>&#xA;</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>&#xA;</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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2017-05-23
    • 2011-10-28
    相关资源
    最近更新 更多