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 ...
Vielen Dank. Das funktioniert. Ich bin allerdings neugierig, warum benötigt etree dann eine Totring-Methode? nur für schönes Drucken? – user3700949
Es wird normalerweise verwendet, um XML-Element/Baum zu drucken, kein XSLT-Transformationsergebnis, das XML, Text, HTML usw. sein kann. – har07