2017-07-13 35 views
0

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

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的标题,我在哪里出错?

+0

我认为你应该先重新格式化你的XML,然后根据那个更新你的XSLT文件。 –

+1

请编辑您的问题并添加预期的输出。 - 您尝试失败的原因是''不会选择任何内容,因为您的XML不会有任何名为'Symbol'或'Open'或'High'的元素。 –

+0

P.S.你有控制你的XML的结构吗?如果我对它所代表的内容进行了正确的猜测,那么它的构建就会非常糟糕,并且需要很多工作才能获得预期的CSV。 –

回答

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

+0

谢谢,它很好。 – WhoAmI

+0

@WhoAmI如果您的问题得到解答,请通过接受答案关闭它。 –