使用JavaScript在IE中加载XML / XSLT

时间:2013-09-03 08:45:16

标签: javascript xml internet-explorer xslt logging

我正在构建一个由this article启发的整洁的日志记录系统。我的一般设置如下:

  1. 我有一个Javascript增强的html页面。
  2. 我有一个XML文档,我现在用作测试日志。
  3. 我有一个XSLT文件,用于将XML转换为HTML(并对其进行美化)。
  4. 因为我想在我的页面中动态加载XML日志文件,所以我在html doc中使用以下代码:

    function loadXMLDoc(dname) {
        if (window.ActiveXObject) {
            xhttp = new ActiveXObject("Msxml2.XMLHTTP.3.0");
        }
        else {
            xhttp = new XMLHttpRequest();
        }
        xhttp.open("GET", dname, false);
        xhttp.send("");
        return xhttp.responseXML;
    }
    
    function displayResult(name) {
        if(name == null)
            xml = loadXMLDoc("testlog.xml");
        else
            xml = loadXMLDoc(name);
        xsl = loadXMLDoc("layout.xsl");
        document.getElementById("logview").innerHTML = "";
        // code for IE
        if (window.ActiveXObject) {
            ex = xml.transformNode(xsl);
            document.getElementById("logview").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("logview").appendChild(resultDocument);
    }
    

    它的作用:当用户选择要加载的本地文件并且传递本地文件的名称时,将调用displayResult()。然后,该脚本将尝试从光盘加载XML文件和XSL文件,并在用新的HTML替换DIV的内容之前将XML转换为HTML。

    我的XML如下所示:

    <?xml version="1.0"?>
    <RunTimeLog>
      <LogHeader>
        <StartDate>02-09-2013</StartDate>
        <StartTime>09:52</StartTime>
        <Platform>Windows 8</Platform>
        <MemoryTotal>1,048,576 kB</MemoryTotal>
      </LogHeader>
      <LogEvents>
    
        <LogEvent id="1">
          <Type>Warning</Type>
          <TimeIndex>00:01:34</TimeIndex>
          <File>application.cc</File>
          <Function>SomeFunction()</Function>
          <LineNumber>314</LineNumber>
          <Message>This is just a randum warning, nothing to worry about!</Message>
        </LogEvent>
        <LogEvent id="2">
          <Type>Debug</Type>
          <TimeIndex>00:01:34</TimeIndex>
          <File>application.cc</File>
          <Function>SomeFunction()</Function>
          <LineNumber>314</LineNumber>
          <Message>This is just a randum warning, nothing to worry about!</Message>
        </LogEvent>
    
      </LogEvents>
    </RunTimeLog>
    

    我的XSLT具有以下结构:

    <?xml version="1.0"?>
    <xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
      <xsl:template match="/">
        <font face="Arial" size="3" color="#000000">
          <b>Run info:</b>
        </font>
        <br/>
        <xsl:apply-templates select="RunTimeLog/LogHeader"/>
        <br/>
        <br/>
        <font face="Arial" size="3" color="#000000">
          <b>Log:</b>
        </font>
        <br/>
        <br/>
                <table border="1" width="100%" cellspacing="0" cellpadding="0" bordercolorlight="#000000" bordercolordark="#ffffff" bordercolor="#000000">
                    <tr>
                        <td width="3%"  bgcolor="#000000"><font size="2" face="Arial" color="#FFFFFF"><b><center>#</center></b></font></td>
                        <td width="20%" bgcolor="#000000"><font size="2" face="Arial" color="#FFFFFF"><b><center>Time</center></b></font></td>
                        <td width="23%" bgcolor="#000000"><font size="2" face="Arial" color="#FFFFFF"><b><center>File</center></b></font></td>
                        <td width="50%" bgcolor="#000000"><font size="2" face="Arial" color="#FFFFFF"><b><center>Function</center></b></font></td>
                        <td width="4%"  bgcolor="#000000"><font size="2" face="Arial" color="#FFFFFF"><b><center>Line</center></b></font></td>
                    </tr>
                    <xsl:apply-templates select="RunTimeLog/LogEvents"/>
                </table>
      </xsl:template>
    

    现在,我遇到的问题如下:这一切都在Firefox中很好用,它使用XMLHttpRequest()来加载文件。但是在IE中使用ActiveX和脚本错误就行了

      ex = xml.transformNode(xsl); 
    

    错误

      SCRIPT16389: The stylesheet does not contain a document element.  The stylesheet may be empty, or it may not be a well-formed XML document.
    

    我尝试过在其他线程和论坛中给出的多种解决方案:更改MIME类型,使用不同的根节点,甚至用不同的文档替换XML和XSLT,这些文档100%可靠。此外,如果我只是在IE中使用XML和XSLT使用href,它显示没有问题。这让我觉得问题在于ActiveXObject的加载功能。这里有人可以解决问题所在吗?

    提前致谢,

    由里

0 个答案:

没有答案