使用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
相关产品推荐
相关产品推荐

