0

我正在使用 XSL 在浏览器中显示电子邮件消息的 XML 表示。电子邮件附件存储在与主电子邮件 XML 文件不同的文件中,因此我希望生成的电子邮件网页包含指向其附件的链接。

然而,一些附件本身就是电子邮件,可能是转发或回复的,因此可能具有包含冒号的名称,例如FW:Important。该名称被 URL 转义为FW%3AImportant,并作为文件存储为FW%3AImportant.xml

问题是我的 XSL 生成网页中的 URL 未转义,并且再次包含冒号 ( file://FW:Important.xml ),因此是一个损坏的链接。阻止这种行为的最佳方法是什么?

这是 XML 片段:

<email:part email:filename="FW%3AImportant">
    <email:attachment filename="FW%3AImportant.xml">
        FW%3AImportant.xml
    </email:attachment>
</email:part>

这是 XSL 片段:

<xsl:template match="email:email/email:parts">
    <xsl:for-each select="email:part/email:attachment">
        <a>
            <xsl:attribute name="href">
                <xsl:value-of select="@filename" />
            </xsl:attribute>
            <xsl:value-of select="@filename" />
        </a>
    </xsl:for-each>             
</xsl:template>
4

1 回答 1

0

我认为你在这里走错了路。取消转义 URL 的不是 XSLT,而是浏览器。

XML(以及 XSLT)已知的唯一转义序列是“ &xxx;”的形式。URL 字符串的 " %xx" 保持不变。

问题是您<a href="...">包含浏览器正在尝试使用的字符串。所以你在编码 URL 时做错了。

当文件系统上的文件存储为:

FW%3Aimportant.xml

那么引用它的正确 URL 必须是:

<a href="FW%253AImportant.xml">FW%3AImportant.xml</a>
<!-- ------^^^ the '%' char itself must be escaped! -->

这意味着您必须在将字符串放入href属性之前对其进行 URL 编码,就像在任何其他生成 HTML 的系统中一样。

不幸的是,XSLT 中没有本地 URL 编码功能。这意味着您可以使用 XSLT 环境的扩展函数,或者使用 XPath 字符串函数在单独的模板中进行编码。由于正确的 URL 编码并非微不足道,因此我建议使用此处证明的内容。这是一个样式表,您可以参考 ( <xsl:import>) 为您完成它: http: //skew.org/xml/stylesheets/url-encode/

于 2009-06-18T08:32:27.017 回答