Как применить XSL с Javascript, когда XSL использует xsl: include? - PullRequest
0 голосов
/ 20 ноября 2018

Я работаю с примером кода XSLT в W3Schools: https://www.w3schools.com/xml/xsl_client.asp

У меня есть этот раздел кода, работающий в IE с базовой обработкой xslt ...

<!DOCTYPE html>
<html>
<head>
<script>
function loadXMLDoc(filename)
{
if (window.ActiveXObject)
  {
  xhttp = new ActiveXObject("Msxml2.XMLHTTP");
  }
else
  {
  xhttp = new XMLHttpRequest();
  }
xhttp.open("GET", filename, false);
try {xhttp.responseType = "msxml-document"} catch(err) {} // Helping IE11
xhttp.send("");
return xhttp.responseXML;
}

function displayResult()
{
xml = loadXMLDoc("cdcatalog.xml");
xsl = loadXMLDoc("cdcatalog.xsl");
// code for IE
if (window.ActiveXObject || xhttp.responseType == "msxml-document")
  {
  ex = xml.transformNode(xsl);
  document.getElementById("example").innerHTML = ex;
  }
}
</script>
</head>
<body onload="displayResult()">
<div id="example" />
</body>
</html> 

проблема в том, что XSL, для которого я масштабирую это решение, имеет сложную структуру, поэтому есть несколько операторов xsl: include для извлечения других шаблонов xsl (https://www.w3schools.com/xml/ref_xsl_el_include.asp). Javascript не обрабатывает импорт xsl: include и XSLTпроцессор продолжает жаловаться на отсутствующие шаблоны.

Как мне заставить Javascript обрабатывать xsl: include?

1 Ответ

0 голосов
/ 22 ноября 2018

Использование 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 с помощью скрипта.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...