哪些字符被认为是结果文档中的合法字符?

前端开发 2026-07-10

我在用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, '[\\:*?&quot;&lt;&gt;|]', '')"/>
        <!--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导航站,无授权禁止任何主体转载、抄袭、复制内容,亦不得私自架设镜像站点。一经侵权,本站将通过法律途径追责。

相关文章