2016-03-19 7 views
2

私はXSLTを使って簡単なXML - > CSVスクリプトを作ろうとしています。私はetreeがタグを出力したいと思っているようです...誰か回避策を知っていますか?はい、私はこの投稿を見ました:XML to CSV Using XSLTPython etree XSLTタグ出力が必要ですか?

以下を参照してください。

ここに参考用のサンプルXMLデータがあります。ヘッダーを書くことさえできなかったので、私のコードはデータで何もしません。

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 ... =なし):

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

は、ここに私のスクリプトです

<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

は、「PythonのetreeのXSLTはタグの出力が必要?」

答えはNO です。

the documentationに例示されるように、XSLT結果オブジェクト;変換結果は、ルート要素を持っているときetree.tostring()がまだ使用可能である、

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 

そして、あなたが見たように:あなたはそれが何のルート要素を持っていない場合は特に、変換結果の予想文字列表現を取得するために、標準のpython str()機能を使用することができます。

+0

ありがとうございます。それは動作します。私は興味がありますが、なぜetreeにはtostringメソッドが必要ですか?ちょうどきれいな印刷用です – user3700949

+0

これは通常、XML要素、/ treeを出力するために使用され、XML、テキスト、HTMLなどのXSLT変換結果は出力されません。 – har07

関連する問題