我想在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文档说:
实现必须接受绝对和相对的UNIX / Linux和 Windows路径以及绝对文件URI。一些例子:
C:\ Test Dir \ my file.xml:Windows平台上的绝对路径。
/ Test Dir / my file.xml:基于UNIX的平台上的绝对路径。
C:\\ Test Dir // \ my file.xml:Windows平台上的绝对路径 容忍任意数量的斜杠和反斜杠。
my file.xml:一个相对路径,指向当前的文件 工作目录。
file:/// C:/Test%20Dir/my%20file.xml:Windows上的绝对文件URI 平台。
file:///Test%20Dir/my%20file.xml:基于UNIX的绝对路径 平台。
这是语法问题吗?函数工作目录是否与我的样式表目录不同?
非常感谢提前!!!!
答案 0 :(得分:1)
在你引用的那篇文章之后,规范说:
函数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)
答案 1 :(得分:0)
正如马丁所说,fn:resolve-uri
功能起到了作用。以下代码工作正常:
<xsl:variable name="binary" select="file:read-binary(resolve-uri('../graphic/cady_1.png'), 16, 8)" as="xs:base64Binary"/>
萨克森的文件说:
EXPath文件模块中的函数使用默认情况下的文件路径 相对于当前工作目录。但是,如果是Java系统 属性expath.base.directory已设置,将优先使用 到当前的工作目录。
因此,EXPATH函数无法解析与样式表相关的路径。
在oXygen 19.0中,Java系统属性expath.base.directory似乎设置为oXygen安装目录。