Вы вынуждены использовать синхронное решение, которое используете сейчас, или же вариант с асинхронным решением также доступен? Я помню, что в прошлом у Firefox были проблемы с синхронными вызовами, и я не знаю, сколько из этого по-прежнему сохраняется. Я видел ситуации, когда весь интерфейс Firefox блокировался до тех пор, пока выполнялся запрос (что, в зависимости от настроек тайм-аута, может занять очень много времени).
Это потребует немного больше работы с вашей стороны, но решение будет что-то вроде следующего. Это код, который я использую для обработки содержимого XSLT с помощью Ajax (слегка переписал его, потому что мой код ориентирован на объект и содержит цикл, который анализирует соответствующий документ XSL из документа XML, загруженного впервые)
Примечание: убедитесь, что вы объявили свою версию oCurrentRequest и oXMLRequest вне функций, так как она будет перенесена.
if (window.XMLHttpRequest)
{
oCurrentRequest = new XMLHttpRequest();
oCurrentRequest.onreadystatechange = processReqChange;
oCurrentRequest.open('GET', sURL, true);
oCurrentRequest.send(null);
}
else if (window.ActiveXObject)
{
oCurrentRequest = new ActiveXObject('Microsoft.XMLHTTP');
if (oCurrentRequest)
{
oCurrentRequest.onreadystatechange = processReqChange;
oCurrentRequest.open('GET', sURL, true);
oCurrentRequest.send();
}
}
После этого вам просто понадобится функция с именем processReqChange, которая содержит что-то вроде следующего:
function processReqChange()
{
if (oCurrentRequest.readyState == 4)
{
if (oCurrentRequest.status == 200)
{
oXMLRequest = oCurrentRequest;
oCurrentRequest = null;
loadXSLDoc();
}
}
}
И, конечно же, вам потребуется создать второй набор функций для обработки загрузки XSL (например, начиная с loadXSLDoc).
Затем в конце вашего процесса XSLReqChange вы можете получить результаты XML и XSL и выполнить преобразование.