encode-for-uri与Windows绝对路径:XML分段存文件的XSLT问题
处理XSLT中Windows路径特殊字符的正确姿势
你的核心问题是Windows绝对路径里的特殊字符(比如%、空格)需要转换成合法的file URI,才能让xsl:result-document正确识别并生成文件。直接拼接或单一编码函数会导致路径解析错误,比如原路径里的%会被当成URI转义前缀,空格会被视为路径分隔符,最终生成的文件路径完全不对。
正确的处理步骤
要搞定这个问题,需要按顺序处理路径的三个关键部分:
- 统一路径分隔符:把Windows的反斜杠
\替换为URI标准的正斜杠/ - 转义
%字符:因为%是URI的转义标记,原路径里的%必须先换成%25,否则后续编码会把它当成转义前缀处理 - 编码其他特殊字符:用XSLT的
encode-for-uri函数处理空格、非ASCII字符等其他需要转义的内容
完整的XSLT代码示例
<xsl:template match="madcapfile"> <!-- 第一步:将Windows反斜杠替换为正斜杠 --> <xsl:variable name="normalized-path" select="replace(@filename, '\\', '/')"/> <!-- 第二步:优先转义原路径中的%(必须在其他编码前做) --> <xsl:variable name="percent-escaped" select="replace($normalized-path, '%', '%25')"/> <!-- 第三步:对剩余特殊字符做URI编码,拼接合法的file URI前缀 --> <xsl:variable name="target-uri" select="concat('file:///', encode-for-uri($percent-escaped))"/> <!-- 生成目标文件,这里以复制当前madcapfile元素内容为例 --> <xsl:result-document href="{$target-uri}" method="xml" indent="yes"> <xsl:copy-of select="."/> </xsl:result-document> </xsl:template>
为什么要这么做?
拿你的示例路径C:\1\Outputpath\The 7% solution.xlf来说:
- 第一步处理后变成:
C:/1/Outputpath/The 7% solution.xlf - 第二步转义
%后:C:/1/Outputpath/The 7%25 solution.xlf - 第三步编码空格后:
file:///C:/1/Outputpath/The%207%25%20solution.xlf
这个最终的URI是完全合法的,xsl:result-document可以准确解析为Windows路径C:\1\Outputpath\The 7% solution.xlf,并在对应位置生成文件。
额外注意事项
- 确保你使用的是XSLT 2.0及以上版本:
replace和encode-for-uri都是2.0引入的函数,旧版本处理器需要自定义转义模板。 - 其他特殊字符无需手动处理:
encode-for-uri会自动处理&、#、中文等非URI保留字符,不用额外写replace规则。
内容的提问来源于stack exchange,提问作者Hobbes
相关产品推荐
相关产品推荐

