在 python 中使用 xslt 转换 xml

Transform xml using xslt in python

我已经在网站上看到了示例和解决方案,但我的编码仍然存在一些问题。我不知道如何改变它。 这是我的 xml 编码,保存为 testing.xml

<?xml version="1.0"?>
<Menu>
 <Title>Snacks</Title>
 <Icecreams>
 <Icecream>Nutella brownie</Icecream>
 <Icecream>Blackcurrent</Icecream>
 </Icecreams>
 <Beverages>
 <Beverage>Fresh Mango Shake</Beverage>
 <Beverage>Cold coffee</Beverage>
 </Beverages>
<Title>Starters</Title>
 <NonvegStarter>
 <Nonveg>Chilly chicken</Nonveg>
 <Nonveg>Chicken Urwal</Nonveg>
 </NonvegStarter>
 <vegStarter>
 <veg>Veg Manchurian</veg>
 <veg>Spring roll</veg>
 </vegStarter>
</Menu>

这是我的 xsl 编码另存为 testing.xsl

<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:strip-space elements="*" />
 <xsl:output method="text" indent="no" />
<xsl:template match="/">
 Menu:<xsl:value-of select="/Menu/Title"/>
 Icecreams: <xsl:apply-templates select="/Menu/Icecreams/Icecream"/>
 </xsl:template>
<xsl:template match="Icecream">
 — <xsl:value-of select="." />
 </xsl:template>
</xsl:stylesheet>

我使用推荐编码

import lxml.etree as ET

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

并且它会输出“名称“testing”未定义”的错误

ET.parse(testing.xml) 应该是 ET.parse('testing.xml')。第二行需要进行相同的更改。

我不明白你想用 XSLT 中的 print(ET.tostring(newdom, pretty_print=True)) 和输出方法 text 实现什么。

无论如何,lxml 文档建议使用 newdom.write_output 例如newdom.write_output('result.txt') 是处理输出 XSLT 转换结果的更好方法。