Skip to main content
 首页 » 编程设计

python之lxml 不执行 xslt 转换

2025年05月04日16zdz8207

使用这段代码:

from lxml import etree 
 
with open( 'C:\\Python33\\projects\\xslt', 'r' ) as xslt, open( 'C:\\Python33\\projects\\result', 'a+' ) as result, open( 'C:\\Python33\\projects\\xml', 'r' ) as xml: 
    s_xml = xml.read() 
    s_xslt = xslt.read() 
    transform = etree.XSLT(etree.XML(s_xslt)) 
    out = transform(etree.XML(s_xml)) 
    result.write(out) 

我收到这个错误:

Traceback (most recent call last): 
  File "<pyshell#7>", line 1, in <module> 
from projects.xslt_transform import trans 
  File ".\projects\xslt_transform.py", line 17, in <module> 
transform = etree.XSLT(etree.XML(s_xslt)) 
  File "xslt.pxi", line 409, in lxml.etree.XSLT.__init__ (src\lxml\lxml.etree.c:150256) 
lxml.etree.XSLTParseError: Invalid expression 

这对 xml/xslt 文件可与其他工具一起使用。

此外,我还必须去掉两个文件顶部声明中的编码属性,以免得到:

ValueError: Unicode strings with encoding declaration are not supported. Please use bytes input or XML fragments without declaration. 

有关系吗?

编辑:

这也不起作用(我得到同样的错误):

with open( 'C:\\Python33\\projects\\xslt', 'r',encoding="utf-8" ) as xslt, open( 'C:\\Python33\\projects\\result', 'a+',encoding="utf-8" ) as result, open( 'C:\\Python33\\projects\\xml', 'r',encoding="utf-8" ) as xml: 
    s_xml = etree.parse(BytesIO(bytes(xml.read(),'UTF-8'))) 
    s_xslt = etree.parse(BytesIO(bytes(xslt.read(),'UTF-8'))) 
    transform = etree.XSLT(s_xslt) 
    out = transform(s_xml) 
    print(out.tostring()) 

阅读 lxml 源代码:这将返回一个异常:

xslt.xsltParseStylesheetDoc(c_doc) 

所以这似乎是一个实际的解析错误。它可以与 namespace 相关吗?

编辑已解决:

s_xml = etree.parse(xml.read()) 
s_xslt = etree.parse(xslt.read()) 

谢谢你

请您参考如下方法:

解析 XML 比“打开一个文本文件,将生成的字符串填充到 etree 中”要复杂得多。

XML 文件是 DOM 树的序列化表示。它们不能作为文本处理,即使它们以文本文件的形式出现。它们采用多字节编码,找出特定文件使用的编码绝非易事。

XML 解析器内置了适当的检测机制,因此应该使用它们来打开 XML 文件。基本的 open() + read() 调用不足以正确处理文件内容。

lxml.etree 提供 the parse() function可以接受多种参数类型:

  • an open file object (make sure to open it in binary mode)
  • a file-like object that has a .read(byte_count) method returning a byte string on each call
  • a filename string
  • an HTTP or FTP URL string

然后将关联文档正确解析回 DOM 树。

您的代码应该更像这样:

from lxml import etree 
 
f_xsl = 'C:\\Python33\\projects\\xslt' 
f_xml = 'C:\\Python33\\projects\\xml' 
f_out = 'C:\\Python33\\projects\\result' 
 
transform = etree.XSLT(etree.parse(f_xsl)) 
result = transform(etree.parse(f_xml)) 
result.write(f_out)