XSL在IE中处理片段

时间:2011-09-08 19:39:13

标签: javascript internet-explorer xslt

我正在尝试使用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;
}

1 个答案:

答案 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);

不确定人们多久会尝试这样做,但希望这可以帮助其他人...