XSL обрабатывает фрагмент в IE - PullRequest
0 голосов
/ 08 сентября 2011

Я пытаюсь использовать 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);

Проблема в том, что я пробовал тысячу вещей в части "если 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;
}

1 Ответ

2 голосов
/ 09 сентября 2011

После гораздо большего количества проб и ошибок я придумал что-то, что работает.Вот что я сделал:

Создайте 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);

Неконечно, как часто люди пытаются это сделать, но, надеюсь, это поможет кому-то еще ..

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...