哪些字符被认为是结果文档中的合法字符?
我在用XSLT将 XML转换成一系列HTML文件。
<xsl:result-document method="html" encoding="UTF-8" href="{$BaseFolder}{$filename}.html">
<html>
...
</html>
某些文档会失败,错误信息为“相对URI的语法无效”。
我已经定位到原因在于 $filename变量,它提供的名称有时包含无效字符。因此,我添加了一个对 $filename进行清理的过程,以获得有效的文件名:
<xsl:template name="make-safe-filename">
<xsl:param name="input"/>
<!--Remove illegal Windows filename characters-->
<xsl:variable name="step1" select="replace($input, '[\\:*?"<>|]', '')"/>
<!--remove path separators-->
<xsl:variable name="step2" select="replace($step1, '/', '-')"/>
<!-- Replace [ and ] with ( and ) -->
<xsl:variable name="step3" select="translate($step2, '[]', '()')"/>
<!--Collapse whitespace-->
<xsl:variable name="step4" select="normalize-space($step3)"/>
<xsl:value-of select="$step4"/>
</xsl:template>
让人吃惊的是,我竟然需要过滤掉 [] 和 ()。这些字符在Windows的文件名中是合法的。我试图找到一个有效/无效字符的清单,但没有成功。RFC 2396指出存在一个“受限的字符集”,但并没有告诉我它们具体是什么。
在哪里可以找到这方面的信息?
解决方案
href属性被定义为一个URI引用,而不是Windows文件名。Saxon必须将其相对于基URI进行解析,这涉及按照URI规范对其进行处理,因此无效字符会导致问题。
你可以尝试使用escape-html-uri() 函数对名称进行转义。
你也可以在结果文档解析器回调中改变URI映射到文件名的方式:请参阅API文档中的 Xslt30Transformer.setResultDocumentHandler()。
站内所有文章版权归属LeftHeroAI导航站,无授权禁止任何主体转载、抄袭、复制内容,亦不得私自架设镜像站点。一经侵权,本站将通过法律途径追责。