Python etree XSLT 需要标签输出吗?

标签 python xml csv xslt elementtree

我正在尝试使用 XSLT 制作一个简单的 XML --> CSV 脚本。我发现 etree 似乎“想要”输出一个标签……有谁知道解决方法吗?是的,我看过这篇文章:XML to CSV Using 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... = 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>

但是这个 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>

此时我想我可以继续使用虚拟标签,然后在最后删除它...

最佳答案

"Python etree XSLT Requires Tag output?"

答案是

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() 仍然可用。

关于Python etree XSLT 需要标签输出吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36107898/

相关文章:

python - 使用 aws 提供动态网页?

python - Gadfly 在 python 中使用保留字。它是如何做到的?

python - Windows 上的 Python 中的快速文件夹大小计算

xml - 在 F# 中使用序列从对象中选择属性

xml - 在 XSL 中隐藏 XML 元素?

python - type 是 Python 中所有类的父类(super class)吗?

java - 如何在Zxing Scanner Camera View中添加按钮

python - 使用 Python 3 将 JSON 转换为 CSV

python - 如何将 CSV 文件读入 Jupyter Notebook

python - 如何合并两个csv文件?