如何从 lxml 错误中获取更多信息?

Mat*_*att 3 python xslt lxml

因为我无法使用 XSL IDE,所以我使用 lxml 编写了一个超级简单的 Python 脚本,以使用给定的 XSL 转换来转换给定的 XML 文件,并将结果写入文件。如下(略):

p = XMLParser(huge_tree=True)
xml = etree.parse(xml_filename, parser=p)
xml_root = xml.getroot()
print(xml_root.tag)
xslt_root = etree.parse(xsl_filename)
transform = etree.XSLT(xslt_root)
newtext = transform(xml)
with open(output, 'w') as f:
    f.write(str(newtext))
Run Code Online (Sandbox Code Playgroud)

我收到以下错误:

“lxml.etree.XSLTApplyError:无法评估'选择'表达式”

...但select我的 XSLT 中有相当多的表达式。在仔细查看隔离的代码块后,我仍然select不知道哪个失败了,或者为什么失败。

在不尝试调试代码的情况下,有没有办法从 lxml 中获取更多信息,例如行号或失败表达式中的引号?

Mat*_*att 7

aaaaa当然,一旦我真正花时间发布问题,我就会偶然发现答案。

这可能是这个问题的重复,但我认为这里的额外好处是 Python 方面。

链接的答案指出每个解析器都包含一个您可以访问的错误日志。唯一的“技巧”是捕获这些错误,以便您可以在创建日志后查看它。

我是这样做的(也许也很糟糕,但它奏效了):

import os
import lxml.etree as etree
from lxml.etree import XMLParser
import sys

xml_filename = '(some path to an XML file)'
xsl_filename = '(some path to an XSL file)'
output = '(some path to a file)'

p = XMLParser(huge_tree=True)
xml = etree.parse(xml_filename, parser=p)
xml_root = xml.getroot()
xslt_root = etree.parse(xsl_filename)
transform = etree.XSLT(xslt_root)
newtext = None
try:
    newtext = transform(xml)
    with open(output, 'w') as f:
        f.write(str(newtext))
except:
    for error in transform.error_log:
        print(error.message, error.line)
Run Code Online (Sandbox Code Playgroud)

此日志中的消息比打印到控制台的消息更具描述性,“行”元素将指向发生故障的行号。