Я пытаюсь использовать XSL для перевода XML-файла в аккуратную таблицу. Для этого я использовал примеры, предоставленные W3schools, которые можно найти в качестве отправной точки here. Тем не менее браузер (хром) бросает ошибку, описанную в заголовке этого сообщения. Я даже попытался скопировать тот же самый пример на W3, чтобы его можно было встретить с той же ошибкой. Пробовал отладки в Firefox, это вывод на консоль
TypeError: Argument 1 of XSLTProcessor.importStylesheet is not an object.
Uncaught TypeError: Не удалось выполнить 'importStylesheet' в 'XSLTProcessor': параметр 1 не имеет тип 'Node'
Аналогичный вопрос был опубликован раньше, и решение было в изменении модели от синхронны ASync. Я попытался сделать это с помощью метода 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>
Спасибо за помощь!
Если вы хотите использовать асинхронный XMLHttpRequest, вам нужно поместить обработку кода и использовать 'responseXML' в обработчик события или хотя бы вызвать его из обработчика события. –
Нет, используйте синхронную загрузку ('xhttp.open (« GET », filename, false);'), как это сделано в примере, к которому вы привязались, или убедитесь, что вы используете 'onreadystatehandler' для работы с responseXML. –
Благодарим вас за ответ Martin. Основываясь на вашем комментарии, я написал этот код 'xhr = new XMLHttpRequest(); \t xhr.onreadystatechange = функция() { \t \t, если (xhr.status == 200 && xhr.readyState == 4) { \t \t \t возвращение xhr.responseXML; \t \t} \t} \t xhr.open ("GET", fileName); \t xhr.send (""); ' Я повторно проанализировал код для использования модели синхронизации, но без обработчиков событий, и он сработал. Однако противоположное утверждение неверно, чтобы использовать асинхронную модель, но с обработчиками событий. Код выше - моя попытка. Мои пристрастия к форматированию, я много раз пытался блокировать его формат, и он не работал. – Cristiansen