我有一个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将其输入视为绝对路径?
答案 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, '\\', '/')))