因为我无法使用 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 中获取更多信息,例如行号或失败表达式中的引号?
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)
此日志中的消息比打印到控制台的消息更具描述性,“行”元素将指向发生故障的行号。