2016-12-29 88 views
0

試圖渲染來自API的XSLT樣式表,認爲它在Chrome,FF以外的IE上工作正常。XSLT不能在IE 11上工作,不會變換xml

我試過使用w3c的例子,它的工作原理是從文件調用XML和XSLT,而我的AJAX調用成功響應來自這個文件。

W3school樣品XSLT sample

我的版本是這樣的

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); 
     }) 
} 

在html顯示XSLT,下面alert()確實顯示你是否嘗試以使其在Chrome或IE瀏覽器,

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); 

    } 
} 

也試過var ex= xmlConverted.transformToFragment(xslConverted, document);

有人可以指出這有什麼問題嗎?也無法在IE11上打開開發工具,這是很難調試,但我可以告訴它的錯誤與我的代碼上面。

編輯 AJAX調用與beforeSend有人可以檢查下面的代碼是好的,雖然transformNode()正在返回Object doesn't support property or method 'transformNode'XSLTProcessor()沒有定義

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

您是否檢查了控制檯是否存在指向該問題的錯誤? –

+0

您無法打開開發工具?打開頁面之前打開它? – epascarello

+0

由於某種原因無法在IE上打開控制檯,它會一直崩潰:/但是當我嘗試W3C的示例時,它完美地工作。 – MrNew

回答

1

IE 11支持的DOMParser但使用它會構建一個不支持XSLT的IE XML DOM文檔。所以你至少需要改變檢查順序,如果你是爲IE編碼並且想要做XSLT,那麼確保你使用ActiveXObject創建一個MSXML DOM文檔,那麼你可以使用它的transformNode

你似乎想從字符串解析XML和XSLT,然後使用客戶端XSLT轉換,我建議使用像在https://martin-honnen.github.io/xslt/2016/test2016123001.html的方法,它不

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; 
    } 
    } 

,然後使用XSLTProcessor中,其中支持或相應的MSXML 6的ActiveX API XSLT運行的轉變:

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; 
     } 
    } 

然後,您可以使用它作爲在

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

是的,我的意思是w3school不是C,我的不好。但否則上面的代碼是正確的?只是需要正確的「if()」? – MrNew

+0

W3school的例子是使用'xhttp'來確定'$ .get()'是否可以訪問'xhttp.responseType'? – MrNew

+0

還有其他一些問題,例如'xmlDoc.async'是一個布爾屬性,如果你想設置它而不是字符串,那麼你應該設置爲一個布爾值,但只要你使用'loadXML'解析就可以了無論如何,解析是同步的。我無法分辨JQuery和瀏覽器DOM/API的混合是否有意義,我不使用JQuery。如果您想要通過HTTP加載XML和XSLT,請參閱http://home.arcor.de/martin.honnen/xslt/test2016081501.html,以獲得適用於IE 11,Edge,Chrome和Mozilla的示例。 –