Использование XSLT в IE и Edge через Javascript представляет собой сложную задачу, так как изначально вы могли бы сделать это, используя различные компоненты MSXML (программный пакет Microsoft, основанный на COM, XML, XPath и XSLT 1.0) напрямую с Microsoft * new ActiveXObject
,Однако, чтобы быть более совместимыми с другими браузерами, они, по крайней мере, на поверхности, перешли на поддержку XMLHttpRequest
(в IE и Edge) и XSLTProcessor
(в Edge), но, насколько я понимаю, под капотом этопо-прежнему используется MSXML 6, в частности для XSLT.
Поскольку MSXML 6 по умолчанию устанавливает для свойства resolveExternals
значение false, использование xsl:import
и xsl:include
завершается неудачно, поэтому использовать MSXML 6 программно (в браузере вы делаете это с помощью Javascript) сначала вам нужно установить для этого свойства значение true, чтобы MSXML затем разрешал и загружал внешние компоненты, такие как импортированные или включенные модули таблиц стилей.Только эти свойства плохо отображаются при загрузке XML через XMLHttpRequest.
Я безуспешно пытался сделать это, не прибегая к слишком большому количеству кода, специфичного для IE, с использованием new ActiveXObject
в https://martin -honnen.github.io/xslt/2018/test2018112004.html (однако код отображается на https://github.com/martin-honnen/martin-honnen.github.io/blob/master/xslt/2018/test2018112004.html),, однако, когда я прекращаю использовать XMLHttpRequest для IE (соответственно, где XSLTProcessor не поддерживается) и напрямую использую все компоненты MSXML 6с new ActiveXObject
и установкой указанного выше свойства, я получаю IE 11 в Windows 10 для разрешения и использования импортированной таблицы стилей через Javascript в https://martin -honnen.github.io / xslt / 2018 / test2018112005.html (код виден в https://github.com/martin-honnen/martin-honnen.github.io/blob/master/xslt/2018/test2018112005.html). Я не пробовал с более ранними версиями IE, кроме попыток использовать режим эмуляции в инструментах разработчика IE 11, основываясь на том, что он также работает с IE 10 и 9.
То, что я делаю в
function loadDocForXslt(url) {
return new Promise(function(resolve) {
if (typeof XSLTProcessor === 'undefined') {
var doc = new ActiveXObject('Msxml2.DOMDocument.6.0');
doc.setProperty('ResolveExternals', true);
doc.onreadystatechange = function() {
if (doc.readyState === 4) {
resolve(doc);
}
};
doc.load(url);
}
else {
var req = new XMLHttpRequest();
req.open("GET", url);
if (typeof XSLTProcessor === 'undefined') {
try {
req.responseType = 'msxml-document';
}
catch (e) {}
}
req.onload = function() {
resolve(this.responseXML)
}
req.send();
}
});
}
, - это создание документа MSXML 6 XML DOM с new ActiveXObject('Msxml2.DOMDocument.6.0')
напрямую и установка свойства doc.setProperty('ResolveExternals', true);
, поэтому включите xsl:import/xsl:include
.
Конечно, как и в большинстве вещей, которые вы делаете в браузере, та же самая политика происхождения по умолчанию не позволяет вам загружать XML из чего-либо, кроме того же источника, из которого исходит ваш HTML с помощью скрипта.