在我解释我面临的问题之前,我可能需要先解释一下我想要解决的问题。 :)
我有一个将使用XSL格式化的XML。此XML包含CDATA中的HTML标记,例如: -
<doc>
<![CDATA[
<b>Hello!</b>
]]>
</doc>
当XSL执行转换时,浏览器会显示<b>Hello!</b>
而不是以粗体显示单词 Hello!。我检查了源代码,它看起来像这样: -
<doc>
<b>Hello!</b>
</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。
答案 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(/</g, "<").replace(/>/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>
<b>Hello!</b> this is a <i>test</i>.
Email me at <a href="mailto:cow@dung.com">Moo</a>.
</doc>
然后,我执行以下操作: -
<xsl:value-of select="..." disable-output-escaping="yes" />
......结果如下: -
似乎每个浏览器都以不同的方式处理渲染......对FF4非常失望... bah。
至少现在,我会坚持使用javascript解决方案,直到找到更好的解决方案。
答案 2 :(得分:0)
您是否尝试首先将obj中的文本转换为变量然后使用变量?
var objText = obj.text();
obj.html(objText);
只是一个快速的建议,我想我会问。