在XSL中处理HTML标记

时间:2011-05-04 19:43:06

标签: javascript jquery xml xslt

在我解释我面临的问题之前,我可能需要先解释一下我想要解决的问题。 :)

我有一个将使用XSL格式化的XML。此XML包含CDATA中的HTML标记,例如: -

<doc>
    <![CDATA[
        <b>Hello!</b>
    ]]>
</doc>

当XSL执行转换时,浏览器会显示<b>Hello!</b>而不是以粗体显示单词 Hello!。我检查了源代码,它看起来像这样: -

<doc>
    &lt;b&gt;Hello!&lt;/b&gt;
</doc>

要解决这个问题,我正在考虑使用JQuery将文本呈现为HTML,如下所示: -

$(document).ready(function(){
    var obj = $(".content");
    alert("text: " + obj.text()); // to test if JQuery works
    obj.html(obj.text());
});

所以,我尝试将JQuery库添加到XSL中,经过几次尝试并阅读<script>标记的问题,似乎我需要在开始和结束之间添加一个虚拟{{1} }标签,像这样: -

<script>

渲染的显示在Firebug中显示2个错误: -

<script type="text/javascript" src="https://ajax.googleapis.com/ajax/libs/jquery/1.5.2/jquery.min.js">
    <xsl:comment/>
</script>

...上面的javascript语句根本不起作用,甚至不是警报提示。

我决定将JQuery从1.5.2降级到1.3.2以查看是否可以修复任何问题。现在,我从Firebug得到了这个错误: -

b.style is undefined
(function(a,b){function ci(a){return d...a:a+"px")}}),a.jQuery=a.$=d})(window);

$ is not defined

好消息是我正在使用JQuery 1.3.2获得警报提示。坏消息是K.style is undefined (function(){var R=/((?:\((?:\([^()]+\)...,typeof K==="string"?K:K+"px")}})})(); 没有做任何事情。

出于好奇,我将obj.html(obj.text());更改为obj.html(obj.text());,这是一项愚蠢的测试,但它确实有效......我看到obj.text("Just Testing: " + obj.text());被插入到实际内容中。

如何让Just Testing:在这里工作?或者更一般的问题是,如何从CData获取HTML标记以呈现为HTML而不是文本?

非常感谢。

更新

我做了另一次测试... obj.html(obj.text());也不起作用。我开始相信它与XSL转换有关,阻止JQuery正常工作。我现在还在使用1.3.2。

3 个答案:

答案 0 :(得分:3)

而不是

<doc>     
  <![CDATA[         
     <b>Hello!</b>     
    ]]> 
</doc> 

使用

<doc>     
  <b>Hello!</b>     
 </doc> 

将标记放入CDATA部分实际上会破坏此标记并将其转换为字符串 - 这会将其维度从2减少到1。

应该避免的非常糟糕的做法!

答案 1 :(得分:1)

经过充实,我想我终于找到了解决问题的方法。我决定不使用JQuery,因为Firebug错误确实让我感到烦恼。

我将getElementsByClassName()函数从How to getElementByClass instead of GetElementById with Javascript?合并到我的解决方案中。我创建了自己的JS“xml.js”: -

<强> xml.js

function getElementsByClassName(node,classname) {
    if (node.getElementsByClassName) { // use native implementation if available
        return node.getElementsByClassName(classname);
    } 
    else {
        return (function getElementsByClass(searchClass,node) {
            if (node == null) {
                node = document;
            }
            var classElements = [],
            els = node.getElementsByTagName("*"),
            elsLen = els.length,
            pattern = new RegExp("(^|\\s)"+searchClass+"(\\s|$)"), i, j;

            for (i = 0, j = 0; i < elsLen; i++) {
                if ( pattern.test(els[i].className) ) {
                    classElements[j] = els[i];
                    j++;
                }
            }
            return classElements;
        })(classname, node);
    }
}

window.onload=function() {
    var elements = getElementsByClassName(document, "html");

    for (var i = 0; i < elements.length; i++) {
         var e = elements[i];
         e.innerHTML = e.innerHTML.replace(/&lt;/g, "<").replace(/&gt;/g, ">");
    }
};

<强> XSL

我在XSL中添加了这个JS引用: -

<script type="text/javascript" src="xml.js"><xsl:comment/></script>

我基本上在需要HTML格式的标签上添加了class="html",例如: -

<p class="html">
    <xsl:call-template name="getDoc" />
</p>

<强> XML

我的XML有很多标记: -

<doc>     
  <![CDATA[         
     <b>Hello!</b> this is a <i>test</i>. 
      Email me at <a href="mailto:cow@dung.com">Moo</a>.
    ]]> 
</doc> 

CDATA中的HTML似乎可以在浏览器中正确呈现。

<强>更新

只是旁注,我也尝试删除CDATA并转义&lt;和&gt;: -

<doc>     
     &lt;b&gt;Hello!&lt;/b&gt; this is a &lt;i&gt;test&lt;/i&gt;. 
      Email me at &lt;a href="mailto:cow@dung.com"&gt;Moo&lt;/a&gt;.
</doc> 

然后,我执行以下操作: -

<xsl:value-of select="..." disable-output-escaping="yes" />

......结果如下: -

  • IE 8:正常工作。
  • Chrome 9:正常工作
  • Safari 5:正常工作
  • Firefox 4:不起作用 - 显示标记而不是粗体字。

似乎每个浏览器都以不同的方式处理渲染......对FF4非常失望... bah。

至少现在,我会坚持使用javascript解决方案,直到找到更好的解决方案。

答案 2 :(得分:0)

您是否尝试首先将obj中的文本转换为变量然后使用变量?

var objText = obj.text();
obj.html(objText);

只是一个快速的建议,我想我会问。