在 EXPath 文件库的 Saxon 实现中解析相对文件路径的问题

Issue with relative file path resolving in Saxon implementation of EXPath file library

我想在 Saxon-EE 9.7.0.15 中使用 EXPath 文件库的 read-binary() 功能。

用文件绝对路径调用函数时,一切正常;但是,当我尝试使用相对路径时,例如<xsl:variable name="binary" select="file:read-binary('../graphic/image.png', 16, 8)" as="xs:base64Binary"/>,Saxon 找不到该文件并发出以下错误消息:

"file:not-found: No file exists at..."

文件模块 1.0 文档说:

An implementation must accept absolute and relative UNIX/Linux and Windows paths as well as absolute file URIs. Some examples:

C:\Test Dir\my file.xml: An absolute path on Windows platforms.

/Test Dir/my file.xml: An absolute path on UNIX-based platforms.

C:\Test Dir//\my file.xml: An absolute path on Windows platforms that tolerates an arbitrary number of slashes and backslashes.

my file.xml: A relative path, pointing to a file in the current working directory.

file:///C:/Test%20Dir/my%20file.xml: An absolute file URI on Windows platforms.

file:///Test%20Dir/my%20file.xml: An absolute path on UNIX-based platforms.

是语法问题吗?函数工作目录是否与我的样式表目录不同?

非常感谢!!!!

就在您引用的文章之后,规范说:

函数file:base-dir可用于解析针对基本URI目录的文件操作:

let $filename := "input.txt"
let $dir := file:base-dir()
let $path := concat($dir, $filename)
return file:read-text($path)

因此,如果您想读取相对于样式表位置的二进制文件,请使用,例如:

file:read-binary(file:base-dir() || '../graphic/image.png', 16, 8)

正如 Martin 所建议的那样,fn:resolve-uri 函数起到了作用。以下代码运行良好:

<xsl:variable name="binary" select="file:read-binary(resolve-uri('../graphic/cady_1.png'), 16, 8)" as="xs:base64Binary"/>

正如撒克逊文档所说:

Functions in the EXPath file module use file paths that by default are relative to the current working directory. However, if the Java system property expath.base.directory is set, this will be used in preference to the current working directory.

因此 EXPATH 函数无法解析相对于样式表的路径。

在oXygen 19.0 Java系统中属性 expath.base.directory似乎设置为oXygen安装目录