Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/368.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 未捕获类型错误:未能执行';导入样式表';在';XSLTProcessor';:参数1的类型不是';节点';_Javascript_Ajax_Xml_Xslt - Fatal编程技术网

Javascript 未捕获类型错误:未能执行';导入样式表';在';XSLTProcessor';:参数1的类型不是';节点';

Javascript 未捕获类型错误:未能执行';导入样式表';在';XSLTProcessor';:参数1的类型不是';节点';,javascript,ajax,xml,xslt,Javascript,Ajax,Xml,Xslt,我正在尝试使用XSL将XML文件转换成一个整洁的表。为此,我使用了W3schools提供的示例,这些示例可以作为起点。然而浏览器(chrome)抛出了本文标题中描述的错误。我甚至尝试在W3上复制完全相同的示例,结果却遇到了相同的错误。尝试在Firefox中调试,这是控制台输出 TypeError:XSLTProcessor.importStylesheet的参数1不是对象。 之前也有类似的问题,解决方案是将模型从同步更改为异步。我尝试通过onreadystatechange方法实现这一点,但没有

我正在尝试使用XSL将XML文件转换成一个整洁的表。为此,我使用了W3schools提供的示例,这些示例可以作为起点。然而浏览器(chrome)抛出了本文标题中描述的错误。我甚至尝试在W3上复制完全相同的示例,结果却遇到了相同的错误。尝试在Firefox中调试,这是控制台输出
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>