如何将XML转换为文本

时间:2015-07-08 01:28:29

标签: python lxml

继我之前的问题(how to transform XML?)之后,我现在有一个结构良好的XML文档,就像这样..

<?xml version="1.0" encoding="UTF-8"?>
<root>
<employee id="1" reportsTo="1" title="CEO">
    <employee id="2" reportsTo="1" title="Director of Operations">
        <employee id="3" reportsTo="2" title="Human Resources Manager" />
    </employee>
</employee>
</root>

现在我需要将它转换为像这样的javascript ..

var treeData = [
{
"name": "CEO",
"parent": "null",
"children": [
  {
    "name": "Director of Operations",
    "parent": "Top Level",
    "children": [
      {
        "name": "Human Resources Manager",
        "parent": "Level 2: A"
      }
   ]
  }
]
}
];

我已经开始编写一个XSLT,目前看起来像这样..

<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns:fo="http://www.w3.org/1999/XSL/Format">
<xsl:output method="text" omit-xml-declaration="yes" indent="yes"/>

<xsl:template match="root">
    <xsl:apply-templates select="employee" />
</xsl:template>

<xsl:template match="employee">
    <xsl:param name="eId" select="@id" />
    <xsl:param name="eReports" select="@reportsTo" />
    <xsl:param name="eTitle" select="@title" />
    <xsl:value-of select="concat( $eTitle, ' and ', $eId )" />      
    <xsl:apply-templates select="employee" />
</xsl:template>

</xsl:stylesheet>

但是当我应用转换(通过pythons lxml库)时,我收到消息“None”。 (如果它有帮助,这是我正在使用的lxml命令......)

dom = ET.parse("input.xml")
xslt = ET.parse("transform.xslt")
transform = ET.XSLT(xslt)
newdom = transform(dom)
print(ET.tostring(newdom, pretty_print=True))

我知道我的XSLT远未完成,但为什么我没有任何输出?我不应该至少打印出职称吗?

1 个答案:

答案 0 :(得分:1)

编辑:现在更新了OP包含他的Python代码。

您的问题是lxml.etree.tostring以及.write方法仅对XML有意义,而不是对output method="text"的XSLT结果有意义,而method=可能没有像XML那样的单个根元素。由于一些令人困惑的原因,函数有一个import lxml.etree as etree data = etree.parse('data.xml') transform = etree.XSLT(etree.parse('txt.xslt')) res = transform(data) bytes(res) 关键字参数,但它没有做任何有用的事情。

这是你应该做的:

b'\nCEO and 1Director of Operations and 2Human Resources Manager and 3\n'
{{1}}

如果您对真实世界的示例感兴趣,I recently made a patch.