如何阻止XSL取消URL

时间:2009-06-18 06:32:54

标签: xml url xslt escaping url-encoding

我正在使用XSL在浏览器中显示电子邮件的XML表示。电子邮件附件存储在主电子邮件XML文件的单独文件中,因此我希望电子邮件的结果网页包含指向其附件的链接。

但是,某些附件本身就是电子邮件,可能是转发或回复,因此可能包含冒号的名称,如 FW:重要。该名称以 FW%3A重要进行网址转义,并以 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>

1 个答案:

答案 0 :(得分:0)

我认为你在这里走错了路。浏览器不是XSLT,而是浏览器。

XML(以及XSLT)已知的唯一转义序列的形式为“&xxx;”。您的网址字符串的“%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/