我正在使用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>
答案 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/