【问题标题】:Values empty on CSV fileCSV 文件中的值为空
【发布时间】:2017-07-13 07:16:40
【问题描述】:

我可以使用 XSLT 从 XML 文件生成 CSV 文件,但是 XML 文件头的唯一标题只显示在 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;

public class xml2csv {
     public static void main() throws Exception {
            File stylesheet = new File("C:/Users/Admin/Desktop/out.xslt");
            File xmlSource = new File("C:/Users/Admin/Desktop/out.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:/Users/Admin/Desktop/out.csv"));
            transformer.transform(source, outputTarget);
        }
}

XML 文件:-

<root>
    <header>Symbol</header>
    <row>NIFTY 50</row>
    <row>LUPIN</row>
    <header>Open</header>
    <row>9,670.35</row>
    <row>1,082.90</row>
    <header>High</header>
    <row>9,684.25</row>
    <row>1,137.00</row>
</root>

XSLT 文件:-

<?xml version="1.0"?>
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns:fo="http://www.w3.org/1999/XSL/Format" >
    <xsl:output method="text" omit-xml-declaration="yes" indent="no"/>
    <xsl:template match="/">
        Symbol,Open,High
        <xsl:for-each select="//header">
            <xsl:value-of select="concat(Symbol, ',', Open, ',', High)"/>
        </xsl:for-each>
    </xsl:template>
</xsl:stylesheet>

所以,我使用这个 XSLT 只获得了 XML 的标头,我哪里出错了?

【问题讨论】:

  • 我认为您应该先重新格式化您的 XML,然后再根据该更新您的 XSLT 文件。
  • 请编辑您的问题并添加预期的输出。 -- 您的尝试失败的原因是&lt;xsl:value-of select="concat(Symbol,',',Open,',',High)"/&gt; 没有选择任何内容,因为您的XML 没有任何名为SymbolOpen High 的元素。
  • P.S.您可以控制 XML 的结构吗?如果我猜对了它所代表的内容,那么它的构造非常糟糕,需要大量工作才能从中获得预期的 CSV。

标签: java xml csv xslt


【解决方案1】:

如果我猜对了您在这里尝试完成的任务,您将需要执行以下操作:

XSLT 1.0

<xsl:stylesheet version="1.0" 
xmlns:xsl="http://www.w3.org/1999/XSL/Transform" >
<xsl:output method="text"/>

<xsl:template match="/root">
    <!-- header -->
    <xsl:text>Symbol,Open,High&#10;</xsl:text>
    <!-- data -->
    <xsl:variable name="n" select="count(row) div 3" />
    <xsl:for-each select="row[position() &lt;= $n]">
        <xsl:variable name="i" select="position()" />
        <xsl:text>"</xsl:text>
        <xsl:value-of select="."/>
        <xsl:text>","</xsl:text>
        <xsl:value-of select="../row[$n + $i]"/>
        <xsl:text>","</xsl:text>
        <xsl:value-of select="../row[2 * $n + $i]"/>        
        <xsl:text>"&#10;</xsl:text>
    </xsl:for-each>
</xsl:template>

</xsl:stylesheet>

应用于您的输入示例,结果将是:

Symbol,Open,High
"NIFTY 50","9,670.35","9,684.25"
"LUPIN","1,082.90","1,137.00"

我在值周围添加了引号,因为其中一些包含逗号 - 但我没有处理其中一些包含引号的可能性。


正如我在对您的问题的评论中提到的,如果您的 XML 以更友好的方式构建,这可能会容易得多。

【讨论】:

  • @WhoAmI 如果您的问题得到解答,请通过接受答案来关闭它。
猜你喜欢
  • 1970-01-01
  • 2023-04-10
  • 2022-11-12
  • 2020-05-09
  • 2023-01-20
  • 1970-01-01
  • 2015-11-25
  • 2020-07-30
  • 1970-01-01
相关资源
最近更新 更多