Javascript 未捕获类型错误:未能执行';导入样式表';在';XSLTProcessor';:参数1的类型不是';节点';
我正在尝试使用XSL将XML文件转换成一个整洁的表。为此,我使用了W3schools提供的示例,这些示例可以作为起点。然而浏览器(chrome)抛出了本文标题中描述的错误。我甚至尝试在W3上复制完全相同的示例,结果却遇到了相同的错误。尝试在Firefox中调试,这是控制台输出Javascript 未捕获类型错误:未能执行';导入样式表';在';XSLTProcessor';:参数1的类型不是';节点';,javascript,ajax,xml,xslt,Javascript,Ajax,Xml,Xslt,我正在尝试使用XSL将XML文件转换成一个整洁的表。为此,我使用了W3schools提供的示例,这些示例可以作为起点。然而浏览器(chrome)抛出了本文标题中描述的错误。我甚至尝试在W3上复制完全相同的示例,结果却遇到了相同的错误。尝试在Firefox中调试,这是控制台输出 TypeError:XSLTProcessor.importStylesheet的参数1不是对象。 之前也有类似的问题,解决方案是将模型从同步更改为异步。我尝试通过onreadystatechange方法实现这一点,但没有
TypeError:XSLTProcessor.importStylesheet的参数1不是对象。
之前也有类似的问题,解决方案是将模型从同步更改为异步。我尝试通过onreadystatechange方法实现这一点,但没有成功。这是我使用的代码
<html>
<head>
<script>
function loadXMLDoc(filename)
{
if (window.ActiveXObject)
{
xhttp = new ActiveXObject("Msxml2.XMLHTTP");
}
else
{
xhttp = new XMLHttpRequest();
}
xhttp.onreadystatechange = function() {
if (xhttp.readyState == 4 && xhttp.status == 200) {
return xhttp.responseXML;
}
};
xhttp.open("GET", filename);
try {xhttp.responseType = "msxml-document"} catch(err) {} // Helping IE11
xhttp.send("");
}
function displayResult()
{
xsl = loadXMLDoc("cdcatalog.xsl");
xml = loadXMLDoc("cdcatalog.xml");
// code for IE
if (window.ActiveXObject || xhttp.responseType == "msxml-document")
{
ex = xml.transformNode(xsl);
document.getElementById("dataTable").innerHTML = ex;
}
// code for Chrome, Firefox, Opera, etc.
else if (document.implementation && document.implementation.createDocument)
{
xsltProcessor = new XSLTProcessor();
xsltProcessor.importStylesheet(xsl);
resultDocument = xsltProcessor.transformToFragment(xml, document);
document.getElementById("dataTable").appendChild(resultDocument);
}
}
</script>
</head>
<body onload="displayResult()">
<div id="dataTable" />
</body>
函数loadXMLDoc(文件名)
{
if(window.ActiveXObject)
{
xhttp=新的ActiveXObject(“Msxml2.XMLHTTP”);
}
其他的
{
xhttp=newXMLHttpRequest();
}
xhttp.onreadystatechange=函数(){
如果(xhttp.readyState==4&&xhttp.status==200){
返回xhttp.responseXML;
}
};
打开(“获取”,文件名);
请尝试{xhttp.responseType=“msxml文档”}catch(err){}//IE11
xhttp.send(“”);
}
函数displayResult()
{
xsl=loadXMLDoc(“cdcatalog.xsl”);
xml=loadXMLDoc(“cdcatalog.xml”);
//IE代码
if(window.ActiveXObject | | xhttp.responseType==“msxml文档”)
{
ex=xml.transformNode(xsl);
document.getElementById(“dataTable”).innerHTML=ex;
}
//Chrome、Firefox、Opera等的代码。
else if(document.implementation&&document.implementation.createDocument)
{
xsltProcessor=新的xsltProcessor();
导入样式表(xsl);
resultDocument=xsltProcessor.transformToFragment(xml,文档);
document.getElementById(“数据表”).appendChild(resultDocument);
}
}
谢谢你的帮助 下面是两个异步请求的示例,其中一个事件处理程序的回调启动下一个请求,该请求的回调执行转换。为了简单起见,我使用了
onload
而不是onreadystatechange
,如果您确实需要对旧IE版本的支持,则需要修改代码
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>XMLHttpRequest and onload handler with asynchronous requests</title>
<script>
function load(url, callback) {
var req = new XMLHttpRequest();
req.open('GET', url);
// to allow us doing XSLT in IE
try { req.responseType = "msxml-document" } catch (ex) {}
req.onload = function() {
callback(req.responseXML);
};
req.send();
}
function transform(xml, xsl) {
load(
xml,
function(inputXml) {
load(
xsl,
function(xsltSheet) {
displayResult(inputXml, xsltSheet);
}
);
}
);
}
function displayResult(xmlInput, xsltSheet) {
if (typeof XSLTProcessor !== 'undefined') {
var proc = new XSLTProcessor();
proc.importStylesheet(xsltSheet);
document.getElementById('example').appendChild(proc.transformToFragment(xmlInput, document));
}
else if (typeof xmlInput.transformNode !== 'undefined') {
document.getElementById("example").innerHTML = xmlInput.transformNode(xsltSheet);
}
}
</script>
</head>
<body onload="transform('catalog.xml', 'catalog.xsl')">
<div id="example"></div>
</body>
</html>
具有异步请求的XMLHttpRequest和onload处理程序
函数加载(url、回调){
var req=新的XMLHttpRequest();
请求打开('GET',url);
//允许我们在IE中使用XSLT
请尝试{req.responseType=“msxml文档”}catch(ex){}
req.onload=函数(){
回调(请求响应xml);
};
请求发送();
}
函数转换(xml、xsl){
装载(
xml,
函数(inputXml){
装载(
xsl,
函数(xsltSheet){
显示结果(输入XML、xsltSheet);
}
);
}
);
}
函数显示结果(xmlInput、xsltSheet){
if(XSLTProcessor的类型!==“未定义”){
var proc=new XSLTProcessor();
过程导入样式表(xsltSheet);
document.getElementById('example').appendChild(proc.transformToFragment(xmlInput,document));
}
else if(typeof xmlInput.transformNode!=“未定义”){
document.getElementById(“示例”).innerHTML=xmlInput.transformNode(xsltSheet);
}
}
在线,可以在Windows 8.1上与当前版本的IE、Firefox和Chrome配合使用
如果要直接启动两个异步请求来加载XML和XSLT,则需要做更多的工作,以确保知道何时加载了这两个文档来处理它们,例如:
具有异步请求的XMLHttpRequest和onload处理程序
函数makeRequest(url、loadedData、属性、ElementToAddressResult){
var req=新的XMLHttpRequest();
请求打开('GET',url);
//允许我们在IE中使用XSLT
请尝试{req.responseType=“msxml文档”}catch(ex){}
req.onload=函数(){
loadedData[属性]=req.responseXML;
如果(选中已加载(加载数据)){
显示结果(loadedData.xmlInput、loadedData.xsltSheet、ElementToAddressResult);
};
};
请求发送();
}
函数检查已加载(loadedData){
返回loadedData.xmlcinput!=null&&loadedData.xsltSheet!=null;
}
函数加载和转换(xml、xsl、ElementToAddressResult){
var loadedData={xmlInput:null,xsltSheet:null};
makeRequest(xml,loadedData,'xmlInput',ElementToAddressResult);
makeRequest(xsl,loadedData,'xsltSheet',ElementToAddressResult);
}
函数显示结果(xmlInput、xsltSheet、ElementToAddressResult){
if(XSLTProcessor的类型!==“未定义”){
var proc=new XSLTProcessor();
过程导入样式表(xsltSheet);
ElementToAddress.appendChild(proc.transformToFragment(xmlInput,document));
}
else if(typeof xmlInput.transformNode!=“未定义”){
ElementToAddressResult.innerHTML=xmlInput.transformNode(xsltSheet);
}
}
如果要使用异步XMLHttpRequest,则需要将代码处理和使用responseXML
放入事件处理程序,或者至少从事件处理程序调用它。不,使用同步加载(xhttp.open(“GET”,filename,false);
)正如您链接到的示例中所做的那样,或者确保使用onreadystatehandler
来处理responseXML。感谢您的回复。根据您的评论,我编写了这段代码xhr=newXMLHttpRequest();xhr.onreadystatechange=function(){if(xhr.status==200&&xhr.readyState==4){return xhr.responseXML;}}}}xhr.open(“GET”,fileName);xhr.send(“”)代码>我重新分解了代码以使用同步模型,但没有事件处理程序,它工作正常。然而,使用异步模型,但使用事件处理程序,情况并非相反。上面的代码是我的尝试。我的格式化方法,我多次尝试阻止格式化,但都没有成功。你可以
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>XMLHttpRequest and onload handler with asynchronous requests</title>
<script>
function makeRequest(url, loadedData, property, elementToAddResult) {
var req = new XMLHttpRequest();
req.open('GET', url);
// to allow us doing XSLT in IE
try { req.responseType = "msxml-document" } catch (ex) {}
req.onload = function() {
loadedData[property] = req.responseXML;
if (checkLoaded(loadedData)) {
displayResult(loadedData.xmlInput, loadedData.xsltSheet, elementToAddResult);
};
};
req.send();
}
function checkLoaded(loadedData) {
return loadedData.xmlInput != null && loadedData.xsltSheet != null;
}
function loadAndTransform(xml, xsl, elementToAddResult) {
var loadedData = { xmlInput: null, xsltSheet: null };
makeRequest(xml, loadedData, 'xmlInput', elementToAddResult);
makeRequest(xsl, loadedData, 'xsltSheet', elementToAddResult);
}
function displayResult(xmlInput, xsltSheet, elementToAddResult) {
if (typeof XSLTProcessor !== 'undefined') {
var proc = new XSLTProcessor();
proc.importStylesheet(xsltSheet);
elementToAddResult.appendChild(proc.transformToFragment(xmlInput, document));
}
else if (typeof xmlInput.transformNode !== 'undefined') {
elementToAddResult.innerHTML = xmlInput.transformNode(xsltSheet);
}
}
</script>
</head>
<body onload="loadAndTransform('catalog.xml', 'catalog.xsl', document.getElementById('example'));">
<div id="example"></div>
</body>
</html>