受这篇文章的启发,我正在构建一个外观整洁的日志记录系统。我的一般设置如下:
- 我有一个 Javascript 增强的 html 页面。
- 我现在有一个 XML 文档用作测试日志。
- 我有一个 XSLT 文件,用于将 XML 转换为 HTML(并美化它)。
因为我想在我的页面中动态加载 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 文件,并将 XML 转换为 HTML,然后用这个新的 HTML 替换 DIV 的内容。
我的 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 类型,使用不同的根节点,甚至用 100% 确定的不同文档替换 XML 和 XSLT。此外,如果我只是在 IE 中使用带 href 的 XML 和 XSLT,它会显示没有问题。这让我相信问题出在 ActiveXObject 的加载功能上。这里有没有人可以阐明这里的问题?
提前致谢,
尤里