CSV文件上的值为空

时间:2017-07-13 07:16:41

标签: java xml csv xslt

我可以使用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的标题,我哪里错了?

1 个答案:

答案 0 :(得分: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以更友好的方式构建,这可能会容易得多。