使用collection()时document-uri()失效:Saxonche 12.3.0在Python中的问题
问题解答
这不是Saxon的bug,而是SaxonHE版本中collection()函数的默认行为限制,或是相对路径解析时未正确关联文档URI导致的。你可以通过以下两种方式解决:
方法1:改用Saxon扩展函数dir()配合doc()
修改XSLT循环逻辑,先通过dir()获取目录下的文件URI,再用doc()加载文档,这样document-uri()就能正确返回文件路径:
<xsl:stylesheet version="3.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform" expand-text="yes"> <xsl:output indent="yes" omit-xml-declaration="yes"/> <xsl:strip-space elements="*"/> <xsl:template name="xsl:initial-template"> <xsl:for-each select="dir('input?select=*.(xml|XML)')!doc(.)"> <xsl:message>Processing "{document-uri()}"...</xsl:message> <xsl:copy-of select="."/> </xsl:for-each> </xsl:template> </xsl:stylesheet>
方法2:为处理器设置基础URI
在Python代码中显式设置基础URI,确保相对路径资源能关联到绝对位置:
import saxonche import os with saxonche.PySaxonProcessor(license=False) as proc: xsltproc = proc.new_xslt30_processor() # 将基础URI设为当前脚本目录的绝对路径 base_uri = f"file:///{os.path.abspath('.').replace(os.sep, '/')}/" xsltproc.set_base_uri(base_uri) executable = xsltproc.compile_stylesheet(stylesheet_file="test.xsl") content = executable.call_template_returning_string() print(f"\ncontent:\n{content}")
补充说明
SaxonHE的collection()函数处理相对路径本地文件时,有时不会自动为加载的文档关联完整URI;而dir()函数会直接返回文件完整URI,通过doc()加载后能保留该信息。显式设置基础URI则能帮助处理器正确解析相对路径资源的绝对位置,让document-uri()返回预期结果。
内容的提问来源于stack exchange,提问作者Daniel Haley
相关产品推荐
相关产品推荐

