2011-10-07 79 views
1

我有一个网页,在点击链接时执行一些JavaScript。这个链接是:使用XSLT解码HTML编码的内容

<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>&lt;p&gt;It may have taken over 12 years</Body> 
</Content> 

以及处理这是一个简单的XSL的XSL:值的说明:

<xsl:template match="/"> 
    <p> 
     <xsl:value-of select="*/*/Body" disable-output-escaping="yes" /> 
    </p> 
    </xsl:template> 

T他的问题是,无论我在'value-of'的'disable-output-escaping'属性中使用什么值,我总是会得到这个呈现(如在Firefox Web开发者生成的源视图中所见):

&lt;p&gt;It may have taken over 12 years 

我想要解码的HTML代码块在渲染时被编码,我的印象是这是禁用输出转义所允许的。

如何将这个非常原始的XML再次变成真正的HTML?

+0

您是否在样式表中将输出元素设置为html? – Treemonkey

回答

0

并非所有的XSLT处理器都支持disable-output-escaping。 Firefox是其中之一。

有一个开放的bug Firefox和它的缺乏支持它:Bug 98168 - (doe) not working

+0

你会推荐任何其他浏览器?最终,我实际上正在为iOS构建一个Web应用程序,所以这将由移动Safari执行,但我们不允许在这里安装桌面Safari ... –

1

有类似的问题转化ATOM XML在帖子的内容包含转义的HTML标记。禁用输出转义似乎适用于大多数浏览器,但不适用于Firefox。所以作为解决方法,在我的XSLT中,我将javascript =“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; 
    } 
}