【发布时间】:2023-02-17 19:43:13
【问题描述】:
我正在尝试使用 saxonpy 执行 XSLT 转换,附带 Python 代码:
from saxonpy import PySaxonProcessor
import os
class XMLProcessor:
proc = PySaxonProcessor(license = False)
def processXSLT2(self, sourceXmlDocPath, xsltStyleSheetPath):
# https://www.saxonica.com/saxon-c/doc1.2/html/saxonc.html#PyXslt30Processor
print(self.proc.version)
self.proc.set_cwd(os.getcwd()) #set the CWD first
xsltproc = self.proc.new_xslt30_processor()
output = xsltproc.transform_to_string(source_file = sourceXmlDocPath,
stylesheet_file = xsltStyleSheetPath)
return output
在我的主要 py 文件中,使用 XMLProcessor.processXSLT2(XMLProcessor, LOCAL_XML_FILE, os.environ['LAMBDA_TASK_ROOT'] + '/metadata.xsl') 调用它
但是,控制台显示此错误消息:
Saxon/C 1.2.1 running with Saxon-HE 9.9.1.5C from Saxonica
Error
I/O error reported by XML parser processing D:\git\lambda\data\test.xml: unknown protocol: d
【问题讨论】:
-
我想,问题是 Windows 文件路径
D:\git\lambda\data\test.xml(您的代码没有准确显示您构建它的位置)以某种方式被 Saxon 视为 URL。可能值得尝试来自stackoverflow.com/a/75143880/252228 的修复程序是否使用例如from pathlib import Path和例如source_file=Path(sourceXmlDocPath).absolute().as_uri()在这里也有帮助。无论如何,使用 SaxonC 12 saxonche 官方包将使将来更容易测试/检查/修复您的代码。 -
是的,我认为@MartinHonnen 是对的。 XSLT 过程的输入是 URI,而不是文件名,Windows 通过使用看起来像但不是 URI 语法的文件名语法来混淆视听。它可能就像将
file:///放在文件名前面一样简单。