You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

使用saxonpy执行XSLT转换时出现I/O错误:unknown protocol: d

使用saxonpy执行XSLT转换时遇到"I/O error: unknown protocol: d"错误

我尝试使用saxonpy库执行XSLT转换,相关Python代码如下:

from saxonpy import PySaxonProcessor
import os

class XMLProcessor:

    proc = PySaxonProcessor(license = False)

    def processXSLT2(self, sourceXmlDocPath, xsltStyleSheetPath):
        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

在主Python文件中,我通过以下方式调用该方法:

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

错误原因

Saxon的XML解析器会将Windows盘符开头的绝对路径(如D:\git\lambda\data\test.xml)误识别为URL协议(解析成d://git/lambda/data/test.xml),但不存在名为d的URL协议,因此抛出该错误。

解决方案

方案1:手动添加file URI前缀

将本地文件路径转换为标准的file:///格式,注意需要三个斜杠,同时把反斜杠替换为正斜杠:

  • 原路径:D:\git\lambda\data\test.xml
  • 转换后:file:///D:/git/lambda/data/test.xml

方案2:代码中自动转换路径

在XMLProcessor类中添加路径转换方法,自动将本地路径转为file URI格式,避免手动修改路径:

from saxonpy import PySaxonProcessor
import os
import urllib.parse

class XMLProcessor:

    proc = PySaxonProcessor(license = False)

    def _path_to_file_uri(self, path):
        # 将本地路径转换为标准file URI
        abs_path = os.path.abspath(path)
        # 替换系统分隔符为正斜杠,转义特殊字符
        encoded_path = urllib.parse.quote(abs_path.replace(os.sep, '/'))
        return f'file:///{encoded_path}'

    def processXSLT2(self, sourceXmlDocPath, xsltStyleSheetPath):
        print(self.proc.version)
        self.proc.set_cwd(os.getcwd())
        xsltproc = self.proc.new_xslt30_processor()
        # 转换路径为file URI后传入
        source_uri = self._path_to_file_uri(sourceXmlDocPath)
        stylesheet_uri = self._path_to_file_uri(xsltStyleSheetPath)
        output = xsltproc.transform_to_string(source_file = source_uri, 
                                                stylesheet_file = stylesheet_uri)

        return output

方案3:使用相对路径

如果XML文件和XSLT文件位于当前工作目录(或其子目录),直接使用相对路径代替绝对路径,比如将D:\git\lambda\data\test.xml改为data/test.xml(假设当前CWD是D:\git\lambda)。


内容的提问来源于stack exchange,提问作者Eugene

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.31 04:18:23