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

时间:2017-09-02 14:12:49

标签: xslt xslt-2.0 saxon

我想在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的绝对路径   平台。

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

非常感谢提前!!!!

2 个答案:

答案 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安装目录。