Это работает для меня.
Я просто прикрепил этот код JavaScript к нажатию кнопки и поместил xsl в файл на сервере.Когда я нажал кнопку, я получил два оповещения, оба с одинаковым содержанием.
Возможно, вы работаете в устаревшем кеше.Я столкнулся с этим только вчера.Я использовал XHR для извлечения XML-файла и получал старую копию.Если вы меняли xsl, это может быть документ, который веб-страница получает, это старая версия, которая также может быть недействительной.Чтобы избежать этого, добавьте ?_<random number>
к URL.
Также вы должны объявлять вашу переменную не более одного раза в функции.В Javascript переменные имеют область действия функции, поэтому независимо от того, где вы поместили объявление var
, это имя переменной известно во всей функции.Это означает, что это хороший стиль кодирования, чтобы поместить все переменные в верхнюю часть функции, независимо от того, где вы их используете.Фактически, это конфликт с объявлением переменной с таким же именем в предложении if, а также в предложении else;Я не знаю, что с этим сделает движок JS, но, строго говоря, не имеет смысла.Легко изменить хотя.
РЕДАКТИРОВАТЬ - Наконец, вы должны использовать обновленный ProgId.См. это сообщение в блоге от Microsoft для объяснения.На самом деле вам не нужно объяснение, короткая история, Microsoft.XMLHTTP
не так.То, что вы должны использовать, это MSXML2.XMLHTTP
.
С этими изменениями мой код выглядит следующим образом:
function loadXMLDoc(dname) {
var xhr = null,
d = new Date(),
noCacheUrl = dname + "?_=" + d.valueOf();
// if the original document is mblase.xsl, then the "no cache" url will be
// sth like mblase.xsl?_399383932 , where the number varies for each request.
// The 'query string' will be discarded and you will get the same static file.
// This insures that you always get a fresh copy of the xsl document.
if (window.XMLHttpRequest) {
xhr = new XMLHttpRequest();
} else {
xhr = new ActiveXObject("MSXML2.XMLHTTP"); // current, correct ProgId
}
xhr.open("GET",noCacheUrl,false);
xhr.send();
alert(xhr.responseText); // displays the contents of the document
alert(xhr.responseXML.xml); // displays an indented version of the XSL document
return xhr.responseXML;
}
Если этот трюк без кэширования не работает, вам необходимо выполнить дальнейшую диагностику.Если бы я пытался диагностировать это, я бы упростил XSL-файл - сделал бы его очень простым XML-файлом и посмотрел, сможете ли вы заставить его работать.Затем постепенно добавляйте обратно сложность.Это позволит вам избежать или исключить проблему неверного / неправильно сформированного XML.