2011-10-07 46 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; 
    } 
}