lxml 不执行 xslt 转换

问题描述 投票:0回答:3

使用此代码:

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)

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

编辑已解决

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

感谢 tomalak

python xml xslt lxml
3个回答
7
投票

解析 XML 比“打开一个文本文件,将结果字符串塞进 etree”.

更复杂

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

XML 解析器内置了适当的检测机制,因此应该使用它们来打开 XML 文件。基本的

open()
+
read()
调用不足以正确处理文件内容。

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

  • 一个打开的文件对象(确保以二进制模式打开它)
  • 一个类似文件的对象,它有一个 .read(byte_count) 方法,在每次调用时返回一个字节字符串
  • 文件名字符串
  • HTTP 或 FTP URL 字符串

然后将关联的文档正确解析回 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)

0
投票

包中的异常

\lxml\xslt.pxi
可以指示xslt模板的错误,详细的错误和消息(lxml.de)可以从
.error_log
数组中提取。


0
投票

\lxml\xslt.pxi
尝试xslt模板转换时出现的详细错误消息存储在属性数组
transform.error_log
中。请参阅:错误和消息(lxml.de).

© www.soinside.com 2019 - 2024. All rights reserved.