2017-06-14 6 views
0

Ich versuche, die Daten von folgenden XML-Attributen rekursiv über XSLT zu lesen.Hilfe beim Abrufen von Daten aus xml rekursiv

Das sind meine XML-Beispieldaten !!

<FIXML ....."> 
    <Batch ....> 
    <MktDef MktID="XEUR" MktSegID="14" EfctvBizDt="2017-05-11" NxtEfctvBizDt="2017-05-15" MktSeg="CONF" MarketSegmentDesc="FUT 8-13 Y. SWISS GOV.BONDS 6%" Sym="CH0002741988" ParentMktSegmID="FBND" Ccy="CHF" MktSegStat="1" USFirmFlag="Y" PartID="2"> 
    . 
    . 
    . 
    </MktDef> 
    <MktDef MktID="XEUR" MktSegID="19629" EfctvBizDt="2017-05-11" NxtEfctvBizDt="2017-05-15" MktSeg="FBON" MarketSegmentDesc="EURO BONO FUTURE 8,5-10,5 YEAR" Sym="DE000A163W29" ParentMktSegmID="FBND" Ccy="EUR" MktSegStat="1" USFirmFlag="Y" PartID="2"> 
    . 
    . 
    . 
    </MktDef> 
    . 
    . 
    . 

Und das ist mein 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="/"> 
MktID,MktSegID,EfctvBizDt,NxtEfctvBizDt,MktSeg,MarketSegmentDesc,Sym,ParentMktSegmID,Ccy,MktSegStat,USFirmFlag,PartID 
<xsl:for-each select="/"> 
<xsl:value-of select="concat(ancestor::FIXML/Batch/MktDef/@MktID,',',ancestor::FIXML/Batch/MktDef/@MktSegID,',',ancestor::FIXML/Batch/MktDef/@EfctvBizDt,',',ancestor::FIXML/Batch/MktDef/@NxtEfctvBizDt,',',ancestor::FIXML/Batch/MktDef/@MktSeg,',',ancestor::FIXML/Batch/MktDef/@MarketSegmentDesc,',',ancestor::FIXML/Batch/MktDef/@Sym,',',ancestor::FIXML/Batch/MktDef/@ParentMktSegmID,',',ancestor::FIXML/Batch/MktDef/@Ccy,',',ancestor::FIXML/Batch/MktDef/@MktSegStat,',',ancestor::FIXML/Batch/MktDef/@USFirmFlagt,',',ancestor::FIXML/Batch/MktDef/@PartID,'&#xA;')"/> 
</xsl:for-each> 
</xsl:template> 
</xsl:stylesheet> 

Das ist mein Java-Code ..

class Xml2Csv { 

    public static void main(String args[]) throws Exception { 
     File stylesheet = new File("style.xsl"); 
     //File xmlSource = new File("Testing-1.xml"); 
     File xmlSource = new File("95FILRDF01PUBLI20170511XEUR6NJ92000.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); 
     System.out.println(source.toString()); 
     System.out.println("Hello"); 
     Result outputTarget = new StreamResult(new File("MktDef.csv")); 
     transformer.transform(source, outputTarget); 

    } 
} 

ich diese xml bin Parsen und versuchen, die Daten zu erhalten, aus MktDef Attribute und speichern Sie es in CSV wie folgt,

MktID MktSegID EfctvBizDt NxtEfctvBizDt MktSeg MarketSegmentDesc Sym ParentMktSegmID Ccy MktSegStat USFirmFlag PartID 
XEUR 14 5/11/2017 5/15/2017 CONF FUT 8-13 Y. SWISS GOV.BONDS 6% CH0002741988 FBND CHF 1  2 
XEUR 14 5/11/2017 5/15/2017 CONF FUT 8-13 Y. SWISS GOV.BONDS 6% CH0002741988 FBND CHF 1  2 
XEUR 14 5/11/2017 5/15/2017 CONF FUT 8-13 Y. SWISS GOV.BONDS 6% CH0002741988 FBND CHF 1  2 
XEUR 14 5/11/2017 5/15/2017 CONF FUT 8-13 Y. SWISS GOV.BONDS 6% CH0002741988 FBND CHF 1  2 
. 
. 
. 

Das Problem, mit dem ich gerade konfrontiert bin, ist, dass ich nur die ersten MktDef-Daten bekomme. Ich habe verstanden, dass es ein logisches Problem in XSLT gibt.

Ich bin sehr neu in der Arbeit an XML und XSLT, also könntest du mir bitte helfen. Vielen Dank im Voraus!

+0

Wo ist das Java in all dem? –

+0

Ich habe gerade den Java-Code hinzugefügt. –

Antwort

1

Wenn Sie innerhalb der Vorlage für den Stammknoten (/) sind, dann ist der XPath in der Auswahl Ihrer for-each relativ von diesem Knoten. Sie möchten über jedes der MktDef Elemente iterieren, so sollte es FIXML/Batch/MktDef sein.

Nun ändert sich der Context-Knoten innerhalb Ihres for-each in jeder Iteration zum aktuellen MkDef Element. Also, um den Wert der aktuellen MktDef Elemente Attribute zu erhalten, wählen Sie relative daraus: dh @MktSegID

Auch wenn Sie wörtlichen Text emittieren, wie Ihre Kopfzeile CSV, legen es in den <xsl:text> Elementen, so dass Sie Sie können Textformatierung und Einzug in Ihrer Vorlage verwenden, und Leerzeichen werden nicht als signifikant angesehen.

<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="/"> 
    <xsl:text>MktID,MktSegID,EfctvBizDt,NxtEfctvBizDt,MktSeg,MarketSegmentDesc,Sym,ParentMktSegmID,Ccy,MktSegStat,USFirmFlag,PartID&#xA;</xsl:text> 

    <xsl:for-each select="FIXML/Batch/MktDef"> 
     <xsl:value-of select="concat(@MktID,',',@MktSegID,',',@EfctvBizDt,',',@NxtEfctvBizDt,',',@MktSeg,',',@MarketSegmentDesc,',',@Sym,',',@ParentMktSegmID,',',@Ccy,',',@MktSegStat,',',@USFirmFlagt,',',@PartID,'&#xA;')"/> 
    </xsl:for-each> 
    </xsl:template> 
</xsl:stylesheet> 
+0

Hallo Hanse, Danke für deine Hilfe. Ich bin in der Lage, alle Daten mit Ihrer modifizierten XSLT zu bekommen, aber es gibt ein kleines Problem. Nach dem Abrufen von Spaltennamen kommt neben den Spaltennamen die erste Zeile der Daten hinzu. MktID, .... MktSegStat \t USFirmFlag \t PartID \t XEUR 5/11/2017 \t 15.05.2017 \t CONF. Wie bekomme ich diese Zeile in die nächste Zeile? –

+0

Zum Beispiel möchte ich eine neue Zeile nach. So dass die Daten, die wir für jede Schleife extrahieren, in die nächste Zeile gelangen. Kannst du mir bitte helfen? Vielen Dank! –

+0

Whoops! Ich hatte die Entity-Referenz für die Zeile in der Kopfzeile weggelassen –

Verwandte Themen