以下JavaScript假设从XML文件中读取热门标记,并将XSL样式表和输出应用于HTML。
function ShowPopularTags() {
xml = XMLDocLoad("http://localhost/xml/tags/popular.xml?s=94987898");
xsl = XMLDocLoad("http://localhost/xml/xsl/popular-tags.xsl");
if (window.ActiveXObject) {
// code for IE
ex = xml.transformNode(xsl);
ex = ex.replace(/\\/g, "");
document.getElementById("popularTags").innerHTML = ex;
} else if (document.implementation && document.implementation.createDocument) {
// code for Mozilla, Firefox, Opera, etc.
xsltProcessor = new XSLTProcessor();
xsltProcessor.importStylesheet(xsl);
resultDocument = xsltProcessor.transformToFragment(xml, document);
document.getElementById("popularTags").appendChild(resultDocument);
var ihtml = document.getElementById("popularTags").innerHTML;
ihtml = ihtml.replace(/\\/g, "");
document.getElementById("popularTags").innerHTML = ihtml;
}
}
ShowPopularTags();
这个脚本的问题是它有时会输出生成的HTML代码,有时则不会。谁知道哪里出错了?
答案 0 :(得分:0)
那么,该代码遵循IE和其他所有内容的完全不同的路径。我认为问题仅限于其中一个问题。您尝试过哪些浏览器,哪些出现此错误?
我能想到的唯一另一件事是,当你尝试做一些东西时,popularTags元素可能不存在。这个函数是如何执行的?在onload / domready事件中?
答案 1 :(得分:0)
丹。 IE执行脚本没有问题。我在Firefox中遇到了这个问题。 popularTags元素存在于调用函数的HTML文档中。
<div id="popularTags" style="line-height:18px"></div> <script language="javascript" type="text/javascript"> function ShowPopularTags() { xml=XMLDocLoad("http://localhost/xml/tags/popular.xml?s=29497105"); xsl=XMLDocLoad("http://localhost/xml/xsl/popular-tags.xsl"); if (window.ActiveXObject){ // code for IE ex=xml.transformNode(xsl); ex = ex.replace(/\\/g, ""); document.getElementById("popularTags").innerHTML=ex; } else if (document.implementation && document.implementation.createDocument){ // code for Mozilla, Firefox, Opera, etc. xsltProcessor=new XSLTProcessor(); xsltProcessor.importStylesheet(xsl); resultDocument = xsltProcessor.transformToFragment(xml,document); document.getElementById("popularTags").appendChild(resultDocument); var ihtml = document.getElementById("popularTags").innerHTML; ihtml = ihtml.replace(/\\/g, ""); document.getElementById("popularTags").innerHTML = ihtml; } } ShowPopularTags(); </script>
答案 2 :(得分:0)
为避免并行加载的问题(如Dan所示),只有在页面完全加载时调用此类脚本始终是个好主意。
理想情况下,您将脚本标记放在页眉中并调用ShowPopularTags();在体内Onload项目。即。
<BODY onLoad="ShowPopularTags();">
这样你就可以完全确定你的document.getElementById(“popularTags”)没有失败,因为在包含元素的HTML被完全加载之前调用了脚本。
另外,我们可以看到你的XMLDocLoad函数吗?如果它也包含非顺序元素,则可能会遇到在完全加载对象xml和xsl之前发生XSLT转换的问题。
答案 3 :(得分:0)
以下是XMLDocLoad函数。
function XMLDocLoad(fname) { var xmlDoc; if (window.ActiveXObject){ // code for IE xmlDoc=new ActiveXObject("Microsoft.XMLDOM"); xmlDoc.async=false; xmlDoc.load(fname); return(xmlDoc); } else if(document.implementation && document.implementation.createDocument){ // code for Mozilla, Firefox, Opera, etc. xmlDoc=document.implementation.createDocument("","",null); xmlDoc.async=false; xmlDoc.load(fname); return(xmlDoc); } else{ alert('Your browser cannot handle this script'); } }
答案 4 :(得分:0)
您是否被迫进入现在使用的同步解决方案,或者也是异步解决方案的选项?我记得Firefox过去曾经遇到过同步调用的问题,我不知道它有多少仍然存在。我已经看到了只要请求正在运行就会锁定整个Firefox界面的情况(这取决于超时设置,可能需要很长时间)。
这需要你做更多的工作,但解决方案将如下所示。这是我用Ajax处理XSLT的代码(稍微重写一遍,因为我的代码是面向对象的,并且包含一个从首次加载的XML文档中解析出适当的XSL文档的循环)
注意:请确保在函数之外声明您的oCurrentRequest和oXMLRequest版本,因为它将被转移。
if (window.XMLHttpRequest)
{
oCurrentRequest = new XMLHttpRequest();
oCurrentRequest.onreadystatechange = processReqChange;
oCurrentRequest.open('GET', sURL, true);
oCurrentRequest.send(null);
}
else if (window.ActiveXObject)
{
oCurrentRequest = new ActiveXObject('Microsoft.XMLHTTP');
if (oCurrentRequest)
{
oCurrentRequest.onreadystatechange = processReqChange;
oCurrentRequest.open('GET', sURL, true);
oCurrentRequest.send();
}
}
在此之后,您只需要一个名为processReqChange的函数,其中包含以下内容:
function processReqChange()
{
if (oCurrentRequest.readyState == 4)
{
if (oCurrentRequest.status == 200)
{
oXMLRequest = oCurrentRequest;
oCurrentRequest = null;
loadXSLDoc();
}
}
}
当然,您需要生成第二组函数来处理XSL加载(例如,从loadXSLDoc开始)。
然后在processXSLReqChange结束时,您可以获取XML结果和XSL结果并进行转换。