JavaScript XSL в Google Chrome - PullRequest
       17

JavaScript XSL в Google Chrome

3 голосов
/ 07 января 2010

Я использую следующий код JavaScript для отображения xml / xsl:

function loadXMLDoc(fname)
{
  var xmlDoc;
  // code for IE
  if (window.ActiveXObject)
  {
    xmlDoc=new ActiveXObject("Microsoft.XMLDOM");
  }
  // code for Mozilla, Firefox, Opera, etc.
  else if (document.implementation
  && document.implementation.createDocument)
  {
    xmlDoc=document.implementation.createDocument("","",null);
   }
  else
  {
    alert('Your browser cannot handle this script');
  }
  try {
    xmlDoc.async=false;
    xmlDoc.load(fname);
    return(xmlDoc);
    }
 catch(e)
 {
  try //Google Chrome
  {
   var xmlhttp = new window.XMLHttpRequest();
   xmlhttp.open("GET",file,false);
   xmlhttp.send(null);
   xmlDoc = xmlhttp.responseXML.documentElement;
   return(xmlDoc);
  }
  catch(e)
  {
   error=e.message;
  }
 }
}

function displayResult()
{
xml=loadXMLDoc("report.xml");
xsl=loadXMLDoc("report.xsl");
// code for IE
if (window.ActiveXObject)
  {
    ex=xml.transformNode(xsl);
    document.getElementById("example").innerHTML=ex;
  }
  // code for Mozilla, Firefox, Opera, etc.
  else if (document.implementation
  && document.implementation.createDocument)
  {
    xsltProcessor=new XSLTProcessor();
    xsltProcessor.importStylesheet(xsl);
    resultDocument = xsltProcessor.transformToFragment(xml,document);
    document.getElementById("example").appendChild(resultDocument);
  }
}

Работает find для IE и Firefox, но хром не работает в строке:

document.getElementById("example").appendChild(resultDocument);

Спасибо за помощь

Ответы [ 2 ]

5 голосов
/ 07 января 2010

Google Chrome в настоящее время имеет ограниченную поддержку XSL. Если ваш XSL ссылается на какие-либо внешние ресурсы (document() функция, xsl:import, xsl:include или внешние объекты), XSL запустится, но результат будет либо пустым, либо недействительным.

Если это не является причиной вашей проблемы, проблема может быть другой: resultDocument и document не имеют общий корень. Попробуйте использовать importNode или аналогичный метод. Если это не удается, и вы уверены, что resultDocument имеет допустимое содержимое, преобразуйте его в строку, добавьте узел вручную и установите innerHTML нового узла в строку. Я знаю, это ужасно, но пока Chrome не станет зрелым, нам понадобятся обходные пути ...

3 голосов
/ 17 июля 2011

Я обнаружил, что Chrome (по крайней мере, для тегов tr и td) требует хорошо сформированного html. Например, вы не можете начать с tr - он должен быть в tbody (или в thead), но вы также не можете начать с него, он должен быть помещен в тег таблицы ... (я не думаю, что механизм xslt прощает правила HTML - даже если вы пытаетесь сформировать фрагмент.)

Так что если вы хотите таблицу из xslt - делайте все, а не часть. Т.е. сделать это:

<table><tbody><tr><td></td></tr></tbody></table>

НЕ ЭТО:

<tbody><tr><td></td></tr></tbody>

ИЛИ ЭТО:

<tr><td></td></tr>

Или, по моему опыту, теги tr были потеряны, и это выглядело как много текста.

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