我正在尝试使用Javascript将XML文件的一部分转换为HTML表的单行。我的想法是,我将从多个XML文件中创建表中的多行。对于Firefox和Opera,这个漂亮的小块代码可以很好地工作。
var resTable = document.createElement('table');
for (i = 0; i < xmlNames.length; i++)
{
// code for IE
if (window.ActiveXObject)
{
}
// code for Mozilla, Firefox, Opera, etc.
else if (document.implementation && document.implementation.createDocument)
{
xml=loadXMLDoc(xmlNames[i]);
xsl=loadXMLDoc(xslName);
xsltProcessor=new XSLTProcessor();
xsltProcessor.importStylesheet(xsl);
resultDocument = xsltProcessor.transformToFragment(xml,document);
resTable.appendChild(resultDocument);
}
}
document.getElementById("theDoc").appendChild(resTable);
问题在于我在“if IE”部分尝试过一千件事,而且没有任何作用。我做了很多谷歌搜索,并在我问之前在这里浏览,但无济于事。事实上,在SO上有一个未解决的问题听起来非常相似,但是没有回复也没有解决方案,所以我希望有人能够帮助我在这里......
我已经成功地获得了一个完整的文档来转换IE,但事实上我想这样做是一个片段是什么导致我的问题..任何帮助将不胜感激!谢谢!
编辑:对不起我忘了提供我的loadXMLDoc功能,以防万一。这是:
function loadXMLDoc(dname)
{
if (window.XMLHttpRequest)
{
xhttp=new XMLHttpRequest();
}
else
{
xhttp=new ActiveXObject("Microsoft.XMLHTTP");
}
xhttp.open("GET",dname,false);
xhttp.send("");
return xhttp.responseXML;
}
答案 0 :(得分:2)
经过更多的反复试验,我想出了一些有效的方法。这是我做的:
像往常一样创建一个xsltProcessor,并调用transform方法。这导致xsltProcessor.output是HTML格式的字符串。当然,我想要一个DOM元素,所以我不得不将HTML字符串转换为DOM。幸运的是,因为我也是XSL样式表的作者,所以我确切地知道我期待什么回来。在我的例子中,输出HTML字符串将是一些&lt; tr&gt; ...&lt; / tr&gt;元素。我最初尝试将resTable(表DOM元素)innerHTML设置为输出字符串,但这不起作用。我仍然不确定为什么,但它似乎与它们是&lt; tr&gt; s有特定关系,并且在表标签的上下文之外设置为innerHTML时无法解析。< / p>
无论如何,我创建了一个临时div元素并将ITs innerHTML设置为一个字符串,其中xsltProcessor的输出字符串包含在&lt; table&gt;&lt; / table&gt;中。标签。现在temp div元素是DOM表,然后我逐步完成并抓住子节点(这是xsl处理器首先返回的tr节点)。看起来有点荒谬,但它确实有效,这是我第一次说出来......这是我测试的所有浏览器中的最终版本..
var resTable = document.createElement('table');
for (i = 0; i < xmlNames.length; i++)
{
// code for IE
if (window.ActiveXObject)
{
var xml = new ActiveXObject("Microsoft.XMLDOM");
xml.async = false;
xml.load(xmlNames[i]);
var xslt = new ActiveXObject("Msxml2.XSLTemplate");
var xsl = new ActiveXObject("Msxml2.FreeThreadedDOMDocument.3.0");
var xsltProcessor;
xsl.async = false;
xsl.resolveExternals = false;
xsl.load(xslName);
xslt.stylesheet = xsl;
xsltProcessor = xslt.createProcessor();
xsltProcessor.input = xml;
//This transform results in one or more tr.../tr HTML tag(s)
xsltProcessor.transform();
//Create a temp div element which is used to convert the HTML
//string to a DOM element so I can grab just the part I want..
tmp = document.createElement('div');
//Can't set innerHTML to tr tags directly I guess, so have to put
//in context of a table so it can be parsed...
tmp.innerHTML = "<table>" + xsltProcessor.output + "</table>";
//Now I need to grad the tr children from inside the table node, since
//the table was only to please the parser
for (tmpChildInd = 0; tmpChildInd < tmp.childNodes[0].childNodes.length; tmpChildInd++)
{
//finally, append the temporary elements children (the tr tags)
//to the overall table I created before the loop.
resTable.appendChild(tmp.childNodes[0].childNodes[tmpChildInd]);
}
}
// code for Mozilla, Firefox, Opera, etc.
else if (document.implementation && document.implementation.createDocument)
{
xml=loadXMLDoc(xmlNames[i]);
xsl=loadXMLDoc(xslName);
xsltProcessor=new XSLTProcessor();
xsltProcessor.importStylesheet(xsl);
resultDocument = xsltProcessor.transformToFragment(xml,document);
resTable.appendChild(resultDocument);
}
}
//put the full table at the div location "theDoc" now..
document.getElementById("theDoc").appendChild(resTable);
不确定人们多久会尝试这样做,但希望这可以帮助其他人...