После гораздо большего количества проб и ошибок я придумал что-то, что работает.Вот что я сделал:
Создайте xsltProcessor как обычно и вызовите метод transform.В результате xsltProcessor.output является строкой в формате HTML.Конечно, я хочу элемент DOM, поэтому мне пришлось преобразовать строку HTML в DOM.К счастью, поскольку я также являюсь автором таблицы стилей XSL, я точно знаю, что я ожидаю вернуться.В моем случае выходная строка HTML будет иметь некоторое количество элементов
... .Сначала я попытался установить в своей выходной строке resTable (элемент DOM таблицы) innerHTML, но это не сработало.Я до сих пор не уверен, почему, но, похоже, это связано с тем фактом, что они были s, и его не удалось проанализировать, когда установлено значение innerHTML вне контекста тега таблицы.
Во всяком случае, я создал временный элемент div и установил в ITs innerHTML строку, содержащую строку вывода xsltProcessor, заключенную в тег
.Теперь элемент temp div - это таблица DOM, через которую я прошел и захватил только дочерние узлы (которые являются tr узлами, которые процессор xsl возвратил в первую очередь).Кажется смешным делать все это, но это работает, и это первый раз, когда я могу сказать это. Вот окончательная версия, которая работает во всех протестированных мной браузерах ..
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);
Неконечно, как часто люди пытаются это сделать, но, надеюсь, это поможет кому-то еще ..