encode-for-uri和绝对Windows路径

时间:2018-04-26 09:03:02

标签: xml xslt xslt-2.0 saxon

我有一个XML文件,其中包含以文件名开头的部分:

<madcapfile filename="C:\1\Outputpath\The 7% solution.xlf">

每个部分都必须保存到单个文件中。 这是我的XSLT:

<xsl:template match="madcapfile">
  <xsl:variable name="file1" select="concat('file:///',@filename)"/>
  <xsl:variable name="file2" select="encode-for-uri($file1)"/>
  <xsl:variable name="file3" select="concat('file:///',replace(@filename,'%','%25'))"/>
  <xsl:result-document method="xml" href="{$file2}">  
    <xsl:apply-templates select="node()"/>
  </xsl:result-document>
</xsl:template>

变量file1,file2,file3是我到目前为止的尝试。 变量file1为所有文件在正确的位置创建文件,但文件名中包含%的文件除外 变量file3为所有文件在正确的位置创建文件,因此这是一个有效的解决方案。

使用变量file2会出错:XSLT处理器(Saxon 9.7)尝试将文件写入

C:\Path-to-XSLT\C:\1\Outputpath\The 7% solution.xlf  

即。看起来像encode-for-uri将其输入视为相对路径,即使它以“C:\”开头 我也尝试在路径的开头添加“file:///”,这不会改变encode-for-uri的行为。

有没有办法强制encode-for-uri将其输入视为绝对路径?

2 个答案:

答案 0 :(得分:3)

关于具体问题:

  

有没有办法强制encode-for-uri将其输入视为   绝对路径?

规范说fn:encode-for-uri:

  

对要在其中使用的字符串中的保留字符进行编码   URI的路径段。

所以答案是否定的:那不是函数的用途。它不是为处理完整的URI或理解它们的语法而设计的;它旨在处理一个字符串,用于构造URI的路径段。

答案 1 :(得分:2)

有两个问题,href属性需要URI,而URI中的分隔符是/而不是\,用于Windows文件路径。此外,使用encode-for-uri可以避免任何反斜杠。

因此,要解决此问题,您应该使用转发斜杠替换任何反斜杠,然后您可以使用encode-for-uri来转义百分号:

concat('file:///', encode-for-uri(replace(@filename, '\\', '/')))