2016-12-29 6 views
0

Der Versuch, XSLT Stylesheet zu rendern, das von API stammt, dachte, es funktioniert gut in Chrome, FF außer IE.XSLT funktioniert nicht auf IE 11, transformiert nicht xml

Ich habe versucht, das Beispiel von w3c, die funktioniert, aber das ist der Aufruf der XML-und XSLT aus einer Datei, wo meiner stammt von AJAX Anruf Erfolg Antwort.

W3school Probe XSLT sample

Meine Version ist dies

function getJson() { 
$.get(url).. 
var json2XMLResult = J2XML.json2xml_str(data); 
getResultXsl(json2XMLResult) 
} 

function getResultXsl(json2xml) { 
    $.get(url) 
     .then(function (data) { 
      let resDefinition = data.Results.ResponseDisplayDefinition; 
      let xmlString = '<?xml version="1.0"?><Response>' + json2xml + '</Response>'; 
      if (typeof DOMParser != "undefined") { 
       parseXml = function (xmlStr) { 
        return (new DOMParser()).parseFromString(xmlStr, "text/xml"); 
       }; 
      } 
      else if (typeof ActiveXObject != "undefined" && 
       new ActiveXObject("Microsoft.XMLDOM")) { 
       parseXml = function (xmlStr) { 
        var xmlDoc = new ActiveXObject("Microsoft.XMLDOM"); 
        xmlDoc.async = "false"; 
        xmlDoc.loadXML(xmlStr); 
        return xmlDoc; 
       }; 
      } 

      else { 
       throw new Error("No XML parser found"); 
      } 

      displayResult(xmlString, resDefinition); 
     }) 
} 

XSLT in dem HTML-Code angezeigt, die alert() unten nicht zeigen, ob Sie es auf Chrome oder Internet Explorer zu machen, sind versucht

function displayResult(xmlStrToConvert, xslStrToConvert) { 
    var xmlConverted = parseXml(xmlStrToConvert); 
    var xslConverted = parseXml(xslStrToConvert); 
    if (window.ActiveXObject || "ActiveXObject" in window) { 
     alert('It is IE but not showing anything'); 
     var ex = xmlConverted.transformNode(xslConverted) 
     $('#xmlJson').append(ex); 
    } else { 
     alert('its not IE'); 
     // code for Chrome, Firefox, Opera, etc. 
     var xsltProcessor = new XSLTProcessor(); 
     xsltProcessor.importStylesheet(xslConverted); 
     var resultDocument = xsltProcessor.transformToFragment(xmlConverted, document); 
     $('#xmlJson').append(resultDocument); 

    } 
} 

Auch versucht var ex= xmlConverted.transformToFragment(xslConverted, document);

Kann jemand darauf hinweisen, was damit nicht stimmt? Außerdem konnte ich das Dev-Tool auf IE11 nicht öffnen, was schwieriger zu debuggen ist, aber ich kann etwas falsch mit meinem Code oben sagen.

bearbeiten Ajax-Aufruf mit beforeSend kann jemand überprüfen, ob der folgende Code in Ordnung ist, wenn die transformNode() ist Object doesn't support property or method 'transformNode' oder XSLTProcessor() nicht definiert

function transformXML(json2xml) { 
$.ajax({ 
    type: 'GET', 
    url: window.parent.__env.apiManagement + 'Preview/TypeDefinition?objectName=' + apiObjectResponse, 
    beforeSend: function (xhr, settings) { 
     if (window.ActiveXObject) { 
      xhr = new ActiveXObject("Msxml2.XMLHTTP"); 
     } 
     else { 
      xhr = new XMLHttpRequest(); 
     } 
     try { xhr.responseType = "msxml-document"; } catch (err) { } 
    }, 
    success: function (data, status, xhr) { 
     var parseXml = new DOMParser(); 
     var xslStylesheet = parseXml.parseFromString(data.Results.ResponseDisplayDefinition, "text/xml"); 
     var xmlString = '<?xml version="1.0"?><Response>' + json2xml + '</Response>'; 
     var convertedXML = parseXml.parseFromString(xmlString, "text/xml"); 

     // // cross-browser logic omitted for simplicity 
     if(window.ActiveXObject || xhr.responseType == "msxml-document") { 
      var ex = convertedXML.transformNode(xslStylesheet); 
      console.log('>>> ', convertedXML) 
      alert(xmlString) 
      $('#xmlJson').append(ex); 
     } 
     // code for Chrome, Firefox, Opera, etc. 
     else if (document.implementation && document.implementation.createDocument) { 
      var xsltProcessor = new XSLTProcessor(); 
      xsltProcessor.importStylesheet(xslStylesheet); 
      var resultDocument = xsltProcessor.transformToFragment(convertedXML, document); 
      $('#xmlJson').append(resultDocument); 
     } 

    } 
}); 

}

+1

Haben Sie die Konsole auf einen Fehler hin überprüft, der auf das Problem hinweist? –

+0

Sie können die Entwicklungswerkzeuge nicht öffnen? Öffnen Sie es, bevor Sie die Seite öffnen? – epascarello

+0

konnte Konsole aus irgendeinem Grund nicht öffnen IE, es stürzt weiter ab:/aber wenn ich das Beispiel von W3C versuchte funktioniert es perfekt. – MrNew

Antwort

1

IE 11 Rückkehr unterstützt DOMParser Wenn Sie es verwenden, wird jedoch ein IE-XML-DOM-Dokument erstellt, das keine Unterstützung für XSLT bietet. So müssen Sie zumindest die Reihenfolge der Prüfungen ändern, wenn Sie für IE programmieren und XSLT ausführen möchten, dann stellen Sie sicher, dass Sie ein MSXML-DOM-Dokument mit ActiveXObject erstellen, dann können Sie transformNode darauf verwenden.

Wie Sie scheinen zu wollen, XML und XSLT von Strings zu analysieren und dann die clientseitige XSLT-Transformation verwenden, würde ich vorschlagen, einen Ansatz wie in https://martin-honnen.github.io/xslt/2016/test2016123001.html, zu verwenden, die

tut
function parseXmlStringForTransformation(xml) { 
     try { 
      var doc = new ActiveXObject('Msxml2.DOMDocument.6.0'); 
      doc.loadXML(xml); 
      return doc; 
     } 
     catch (e) { 
      var domParser = new DOMParser(); 
      var doc = domParser.parseFromString(xml, 'application/xml'); 
      return doc; 
    } 
    } 

und dann XSLTProcessor verwendet, wo unterstützt oder das entsprechende MSXML 6 ActiveX XSLT API die Transformation auszuführen:

function transform(xmlDoc, xslDoc, xsltParams, targetElement) { 
     if (typeof XSLTProcessor !== 'undefined') { 
     var proc = new XSLTProcessor(); 
     proc.importStylesheet(xslDoc); 

     for (var prop in xsltParams) { 
      proc.setParameter(null, prop, xsltParams[prop]); 
     } 

     var resultFrag = proc.transformToFragment(xmlDoc, targetElement.ownerDocument); 

     targetElement.textContent = ''; 
     targetElement.appendChild(resultFrag); 
     } 
     else { 
      var template = new ActiveXObject('Msxml2.XslTemplate.6.0'); 
      template.stylesheet = xslDoc; 
      var proc = template.createProcessor(); 

      for (var prop in xsltParams) { 
      proc.addParameter(prop, xsltParams[prop]); 
      } 

      proc.input = xmlDoc; 

      proc.transform(); 

      var resultHTML = proc.output; 

      targetElement.innerHTML = resultHTML; 
     } 
    } 

Sie können dann verwendet werden, dass, wie in

document.addEventListener('DOMContentLoaded', function() { 
    transform(
     parseXmlStringForTransformation('<root>...<\/root>'), 
     parseXmlStringForTransformation('<xsl:stylesheet ...>...<\/xsl:stylesheet>'), 
     { }, // empty parameter object if you don't want to pass parameters from Javascript to XSLT 
     document.getElementById('d1') // target element in your HTML to insert the transformation result into 
    ); 
    }) 
+0

Ja, ich meinte w3school nicht C, mein Schlechter. Aber ansonsten ist der obige Code richtig? Nur das 'if()' das muss richtig sein? – MrNew

+0

Das Beispiel auf W3school verwendet 'xhttp' hat' $ .get() 'Zugriff auf' xhttp.responseType'? – MrNew

+0

Es gibt andere Probleme wie 'xmlDoc.async' ist eine boolesche Eigenschaft, die Sie auf einen booleschen Javascript-Wert setzen sollten, wenn Sie ihn setzen wollen und nicht auf eine Zeichenkette, aber soweit ich mich erinnere, solange Sie' loadXML' zum Parsen verwenden Eine Zeichenkette, die syntaktisch syntaktisch ist.Ich kann nicht sagen, ob diese Mischung aus JQuery mit Browser-DOM/APIs Sinn macht, ich benutze JQuery nicht. Wenn Sie XML und XSLT über HTTP laden möchten, finden Sie unter http://home.arcor.de/martin.honnen/xslt/test2016081501.html ein Beispiel, das mit IE 11, Edge, Chrome, Mozilla funktioniert. –