2017-07-13 2 views
0

Ich bin in der Lage, CSV-Datei aus XML-Datei mit XSLT zu generieren, aber der einzige Header der XML-Datei-Header wird nur auf CSV-Datei angezeigt. Die Werte werden nicht angezeigt.Werte leer in CSV-Datei

Hier ist mein Java-Code: -

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); 
     } 
} 

die XML-Datei: -

<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-Datei: -

<?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> 

So, Ich bekomme nur Header von XML mit dieser XSLT, wo liege ich falsch?

+0

Ich denke, Sie sollten zuerst Ihre XML formatieren und dann entsprechend Ihre XSLT-Datei aktualisieren. –

+1

Bitte bearbeiten Sie Ihre Frage und fügen Sie die erwartete Ausgabe hinzu. - Der Grund, warum Ihr Versuch fehlschlägt, ist, dass '' nichts auswählt, weil Ihr XML das nicht tut habe irgendwelche Elemente mit dem Namen 'Symbol' oder' Offen 'oder' Hoch'. –

+0

P.S. Haben Sie die Kontrolle über die Struktur Ihres XML? Wenn ich richtig einschätze, was es darstellt, ist es sehr schlecht konstruiert und es wird viel Arbeit brauchen, um die erwartete CSV daraus zu machen. –

Antwort

1

Wenn ich raten bin richtig an, was Sie versuchen, hier zu erreichen, müssen Sie so etwas wie zu tun:

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> 

Angewandt auf die Eingabe beispielsweise das Ergebnis sein wird: um die Werte

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

ich habe Anführungszeichen hinzugefügt, da einige von ihnen Kommata enthalten - aber ich habe nicht den Griff pos Möglichkeit, dass einige ein Zitat enthalten.


Wie ich in einem Kommentar zu Ihrer Frage erwähnt, könnte dies viel einfacher sein, wenn Ihr XML in einem Freundlichen Weise strukturiert wurden.

+0

Danke, es ist gut. – WhoAmI

+0

@WhoAmI Wenn Ihre Frage beantwortet wird, schließen Sie sie bitte, indem Sie die Antwort akzeptieren. –

Verwandte Themen