【问题标题】:Python saxonpy returns I/O error when transforming XMLPython saxonpy 在转换 XML 时返回 I/O 错误
【发布时间】: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:/// 放在文件名前面一样简单。

标签: python xml saxon


【解决方案1】:

您正在向需要 URI 的接口提供 Windows 文件名。

您还在使用非常过时的产品:请继续使用 SaxonC 12.x。

【讨论】:

    猜你喜欢
    • 2015-09-15
    • 2014-05-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-04-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多