【问题标题】:XML to CSV dynamic conversion using XSL - unable to obtain tag names使用 XSL 将 XML 动态转换为 CSV - 无法获取标记名称
【发布时间】:2014-06-11 09:58:19
【问题描述】:

我正在尝试使用 Java 代码将 XML 文件动态转换为 CSV 文件。我能够获得转换为 CSV 的数据,但问题在于标题行。我需要将第一行添加到具有该列名称的 CSV 文件中。

这是Java代码:

import java.io.File;
import javax.xml.parsers.DocumentBuilder;
import javax.xml.parsers.DocumentBuilderFactory;
import javax.xml.transform.Result;
import javax.xml.transform.Source;
import javax.xml.transform.Transformer;
import javax.xml.transform.TransformerFactory;
import javax.xml.transform.dom.DOMSource;
import javax.xml.transform.stream.StreamResult;
import javax.xml.transform.stream.StreamSource;

import org.w3c.dom.Document;

class xmltocsv {

    public static void main(String args[]) throws Exception {
        File stylesheet = new File("C:/testxsl.xsl");
        File xmlSource = new File("C:/test.xml");

        DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance();
        DocumentBuilder builder = factory.newDocumentBuilder();
        Document document = builder.parse(xmlSource);

        StreamSource stylesource = new StreamSource(stylesheet);
        Transformer transformer = TransformerFactory.newInstance()
            .newTransformer(stylesource);
        Source source = new DOMSource(document);
        Result outputTarget = new StreamResult(new File("c:/output.csv"));
        transformer.transform(source, outputTarget);
    }
}

这是我的示例 XML:

<record>
 <column name="ID">537316</column>
 <column name="TYPE">MANUAL</column>
 <column name="SECONDID" />
 <column name="KEY">345</column>
</record>

这是我的 XSL 文件:

<xsl:stylesheet version="1.0"
xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:template match="/*">
<xsl:for-each select="*[1]/*">
<xsl:value-of select="name()"/>
<xsl:if test="position() != last()">, </xsl:if>
<xsl:if test="position() = last()">
<xsl:text>&#xD;</xsl:text>
</xsl:if>
</xsl:for-each>
<xsl:apply-templates/>
</xsl:template>
<xsl:output method="text" encoding="iso-8859-1"/>
<xsl:param name="fieldNames" select="'yes'" />
<xsl:strip-space elements="*" />
<xsl:template match="/*/child::*">
<xsl:for-each select="child::*">
<xsl:if test="position() != last()"><xsl:value-of select="normalize-space(.)"/>, </xsl:if>
<xsl:if test="position() = last()"><xsl:value-of select="normalize-space  (.)"/><xsl:text>&#xD;</xsl:text>
</xsl:if>
</xsl:for-each>
</xsl:template>
</xsl:stylesheet>

样本输出应该是:

ID,TYPE,SECONDID,KEY\n
537316,MANUAL,,345\n

问题是,XML文件是数据库输出,会动态变化,所以需要动态获取标签名。

Here using  <xsl:value-of select="name()"/>

我将标签名称作为 ID、TYPE 等的列插入。 除了 name() 之外还有其他方法可以让我从 XML 中获取正确的标签名称。

【问题讨论】:

    标签: java xml xslt csv


    【解决方案1】:

    除了 name() 还有其他方法可以让我得到 来自 XML 的正确标签名称。

    您不需要标签名称,您需要name 属性的值。这可以通过以下方式返回:

    <xsl:value-of select="@name"/>
    

    【讨论】:

    • 谢谢米歇尔,但我得到了错误,因为我给了“@name”的名字。致命错误:“无法编译样式表”线程“主”javax.xml.transform.TransformerConfigurationException:无法在 com.sun.org.apache.xalan.internal.xsltc.trax.TransformerFactoryImpl.newTemplates 编译样式表(TransformerFactoryImpl。 java:828) 在 com.sun.org.apache.xalan.internal.xsltc.trax.TransformerFactoryImpl.newTransformer(TransformerFactoryImpl.java:617) 在 xmltocsv.main(xmltocsv.java:26)
    • 我将我的代码复制到那里,我得到了这个错误:表达式@name()中的错误:@ 必须后跟 NameTest 或 NodeTest。我是 XSL 的新手,请您帮帮我这个错误
    • @user3729311 我猜你有&lt;xsl:value-of select="@name()"/&gt; 而不是&lt;xsl:value-of select="@name"/&gt;(不带括号)。
    • 非常感谢米哈尔 :)
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2016-02-13
    • 2013-06-23
    • 2022-01-09
    • 1970-01-01
    • 1970-01-01
    • 2022-01-11
    • 1970-01-01
    相关资源
    最近更新 更多