2016-03-19 4 views
2

Ich versuche ein einfaches XML -> CSV-Skript mit XSLT zu erstellen. Ich fand, dass etree scheint, ein Tag zu wollen, um auszugeben ... Kennt jemand einen Workaround? Ja, ich habe diesen Beitrag gesehen: XML to CSV Using XSLT.Python etree XSLT Erfordert Tag-Ausgabe?

Siehe unten ...

Hier ist ein XML-Beispieldaten nur als Referenz. Mein Code tut noch nicht einmal etwas mit den Daten, da es nicht einmal möglich war, einen Header zu schreiben.

<projects> 
    <project> 
    <name>Shockwave</name> 
    <language>Ruby</language> 
    <owner>Brian May</owner> 
    <state>New</state> 
    <startDate>31/10/2008 0:00:00</startDate> 
    </project> 
    <project> 
    <name>Other</name> 
    <language>Erlang</language> 
    <owner>Takashi Miike</owner> 
    <state> Canceled </state> 
    <startDate>07/11/2008 0:00:00</startDate> 
    </project> 
    </projects> 

Hier ist mein Skript:

import sys 
    from lxml import etree 

    system_file = sys.argv[1] 
    xml_file = sys.argv[2] 

    sys_txt = open(system_file,"r").read() 
    xsl_txt = open("csv_file.xslt","r").read() 


    sysroot = etree.fromstring(sys_txt) 
    xslroot = etree.fromstring(xsl_txt) 
    transform = etree.XSLT(xslroot) 

    with open(xml_file, "w") as f: 
     f.write(etree.tostring(transform(sysroot))) 

Dieses XSLT-Code nicht funktioniert (etree.tostring ... = None):

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

    </xsl:stylesheet> 

aber DIESES XSLT funktioniert ... scheint etree muss eine XML-Datei ausgeben?

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

    </xsl:stylesheet> 

An diesem Punkt bin ich denke mit einem Dummy-Tag gehen können, ist es dann am Ende entfernen ...

Antwort

1

"Python etree XSLT Erfordert Ausgabe Tag?"

Die Antwort ist NO.

Wie in the documentation, Abschnitt XSLT Ergebnisobjekte; Sie können Standard-Python-str() Funktion verwenden, um die erwarteten String-Darstellung des Transformationsergebnisses zu erhalten, vor allem, wenn es kein Wurzelelement hat:

from lxml import etree 

raw_xml = '''<projects> 
    <project> 
    <name>Shockwave</name> 
    <language>Ruby</language> 
    <owner>Brian May</owner> 
    <state>New</state> 
    <startDate>31/10/2008 0:00:00</startDate> 
    </project> 
    <project> 
    <name>Other</name> 
    <language>Erlang</language> 
    <owner>Takashi Miike</owner> 
    <state>Canceled</state> 
    <startDate>07/11/2008 0:00:00</startDate> 
    </project> 
</projects>''' 
raw_xslt = '''<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="1.0"> 
    <xsl:output method="text"/> 
    <xsl:template match="/"> 
    <xsl:text>Hi</xsl:text> 
    </xsl:template> 
</xsl:stylesheet>''' 

sysroot = etree.fromstring(raw_xml) 
xslroot = etree.fromstring(raw_xslt) 
transform = etree.XSLT(xslroot) 

print str(transform(sysroot)) 
# output: 
# Hi 

Und wie Sie gesehen haben, etree.tostring() ist noch verwendbar, wenn das Transformationser ein Wurzelelement hat .

+0

Vielen Dank. Das funktioniert. Ich bin allerdings neugierig, warum benötigt etree dann eine Totring-Methode? nur für schönes Drucken? – user3700949

+0

Es wird normalerweise verwendet, um XML-Element/Baum zu drucken, kein XSLT-Transformationsergebnis, das XML, Text, HTML usw. sein kann. – har07

Verwandte Themen