2016-03-19 33 views
2

我想使用XSLT製作一個簡單的XML - > CSV腳本。我發現etree似乎「想要」一個標籤輸出...有誰知道一種解決方法?是的,我見過這個帖子:XML to CSV Using XSLTPython etree XSLT需要標記輸出嗎?

見下文......

下面是一個示例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> 

這裏是我的腳本:

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

這XSLT代碼不起作用(etree.tostring ... =無):

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

但這XSLT不工作...似乎etree需要輸出一個XML文件?

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

在這一點上我想我可以用假標籤進行,然後在年底將其刪除...

回答

1

「巨​​蟒etree XSLT需要標籤的輸出?」

答案是NO

如在the documentation中示例的部分XSLT結果對象;你可以使用標準的Python str()函數來獲取轉換結果的預期字符串表示,特別是當它沒有根元素:

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 

正如你所看到的,etree.tostring()仍然是可用的,當轉換結果有一個根元素。

+0

謝謝。這樣可行。我很好奇,爲什麼然後etree需要一個tostring方法?只是爲了漂亮打印? – user3700949

+0

它通常用於打印XML元素/樹,而不是可以是XML,文本,HTML等的XSLT轉換結果。 – har07