我有一个网页,在链接点击时会执行一些javascript。链接是:
<a
href="javascript:void(0)"
onclick="XsltTransform('category.xml','category.xslt');">Latest news</a>
javascript是:
<script type="text/javascript">
function XsltTransform(xmlfile, xslfile) {
var xml = document.implementation.createDocument("", "", null);
var xslt = document.implementation.createDocument("", "", null);
xml.async = false;
xslt.async = false;
xml.load(xmlfile);
xslt.load(xslfile);
var processor = new XSLTProcessor();
processor.importStylesheet(xslt);
var XmlDom = processor.transformToDocument(xml)
var serializer = new XMLSerializer();
var output = serializer.serializeToString(XmlDom.documentElement);
var outputDiv = document.getElementById("contentbody");
outputDiv.innerHTML = output;
}
</script>
处理的XML看起来非常像:
<Content>
<Body><p>It may have taken over 12 years</Body>
</Content>
处理它的XSL是一个简单的xsl:value-of语句:
<xsl:template match="/">
<p>
<xsl:value-of select="*/*/Body" disable-output-escaping="yes" />
</p>
</xsl:template>
问题在于,无论我在'value-of'的'disable-output-escaping'属性中使用什么值,我总是得到这个(如在Firefox web开发人员生成的源视图中所见):
<p>It may have taken over 12 years
我希望在渲染时对已解码的HTML块进行编码,并且我认为这是禁用 - 输出 - 转义允许的内容。
如何让这个非常原始的XML再次成为真正的HTML?
答案 0 :(得分:1)
有一个类似的问题是转换ATOM XML,其中帖子的内容包含转义的HTML标记。 disable-output-escaping似乎适用于大多数浏览器,但不适用于Firefox。因此,作为一种解决方法,在我的XSLT中,我将class =“renderhtml”属性添加到所有有问题的输出节点,作为javascript的提示。然后在转换后添加以下代码。
// work around for XSLT disable-output-escaping="yes" not working in Firefox
if (navigator.userAgent.indexOf("Firefox")!=-1) {
// get all "renderhtml" hints (HTML escaped within CDATA/text) nodes, then unescape and render HTML code
var nodes = document.getElementsByClassName("renderhtml");
for (var i = nodes.length - 1; i >= 0; i--) {
nodes[i].innerHTML = nodes[i].textContent;
}
}
答案 1 :(得分:0)
并非所有XSLT处理器都支持disable-output-escaping
。 Firefox就是其中之一。
Firefox存在一个漏洞,它缺乏对它的支持:Bug 98168 - (doe) not working