2012-08-27 47 views
4

我有一些JavaScript问题似乎只发生在Windows 8上的Internet Explorer 10中(IE 7,8和9全部工作精细)。我正在做的是从Web服务获取XML和XSL,然后使用JavaScript转换它们以使用Sys.Net.XMLDOM对象在页面上呈现。对象不支持在Internet Explorer 10(Windows 8)中的属性或方法'transformNode'

XMLDOM = Sys.Net.XMLDOM; 

var xsl = // XSL gotten from somewhere else 
var xmlString = // XML gotten from somewhere else as a string... 
var xml = new XMLDOM(xmlString); 

var content = xml.transformNode(xsl); 

当我在IE 10使用上面的代码,我得到:

对象不支持属性或方法 '的transformNode'

为什么Internet Explorer的10任何想法正在这样做?

编辑

我也试过这样:

xmldoc = new ActiveXObject("Msxml2.DOMDocument"); 
xmldoc.async = false; 
xmldoc.load(xml); 

xsldoc = new ActiveXObject("Msxml2.DOMDocument"); 
xsldoc.async = false; 
xsldoc.load(xsl); 

var content = xmldoc.transformNode(xsldoc); 

在IE浏览器的所有先前版本的其中一期工程,但在IE 10,我得到:

引用了未声明的命名空间前缀:'atom'。

回答

4

找到了答案:http://blogs.msdn.com/b/ie/archive/2012/07/19/xmlhttprequest-responsexml-in-ie10-release-preview.aspx

IE 10需要使用具有设置为的responseType一个XMLHttpRequest“ MSXML文档”。有一次,我切换的代码到,一切都完美的作品在所有浏览器:

if (window.XMLHttpRequest) { 
    xhr = new XMLHttpRequest(); 
} else { 
    xhr = new ActiveXObject("Microsoft.XMLHTTP"); // For IE 6 
} 
xhr.open("GET", url, false); 
try { xhr.responseType = "msxml-document"; } catch (e) { }; 
xhr.send(); 
+0

你将如何将XML添加到XMLHttRequest。问题和答案的上下文不匹配。我是一个新手可以请你根据这个问题来阐述答案。我正面临着类似的问题:“引用未声明的命名空间前缀:'atom' ” – nanospeck

4
IE

9和磨碎器不支持它,尝试该功能(found online

function TransformToHtmlText(xmlDoc, xsltDoc) { 
    if (typeof (XSLTProcessor) != "undefined") { // FF, Safari, Chrome etc 
     var xsltProcessor = new XSLTProcessor(); 
     xsltProcessor.importStylesheet(xsltDoc); 
     var xmlFragment = xsltProcessor.transformToFragment(xmlDoc, document); 
     return GetXmlStringFromXmlDoc(xmlFragment); 
    } 

    if (typeof (xmlDoc.transformNode) != "undefined") { // IE6, IE7, IE8 
     return xmlDoc.transformNode(xsltDoc); 
    } 
    else { 
     try { // IE9 and grater 
      if (window.ActiveXObject) { 
       var xslt = new ActiveXObject("Msxml2.XSLTemplate"); 
       var xslDoc = new ActiveXObject("Msxml2.FreeThreadedDOMDocument"); 
       xslDoc.loadXML(xsltDoc.xml); 
       xslt.stylesheet = xslDoc; 
       var xslProc = xslt.createProcessor(); 
       xslProc.input = xmlDoc; 
       xslProc.transform(); 
       return xslProc.output; 
      } 
     } 
     catch (e) { 
      alert("The type [XSLTProcessor] and the function [XmlDocument.transformNode] are not supported by this browser, can't transform XML document to HTML string!"); 
      return null; 
     } 

    } 
} 
var content = TransformToHtmlText(xml, xsl); 
+0

我喜欢这个解决方案。但是,通过这个,我得到了“未声明的命名空间前缀引用:'atom'”。错误信息。 –

+0

@JohnChapman,[检查此](http://p2p.wrox.com/xslt/29978-confused-about-xml-namespaces.html),可能会有所帮助。 –

+1

顺便说一下,这一切都在IE9完美的作品,所以我认为有一个新的转折,在IE10所有这一切。只是不知道是什么。 –

0

一是信贷罗埃尔面包车Lisdonk谁发布的谢赫Heera共享的功能。

,我发现这个功能,因为它是在Chrome中并没有工作,因为GetXmlStringFromXmlDoc的,(),所以我用的XMLSerializer:

因此,例如:

if (typeof(GetXmlStringFromXmlDoc)!= "undefined") 
{  
    return GetXmlStringFromXmlDoc(xmlFragment); 
} 
else 
{ 
    // chrome friendly 

    // get a xml serializer object 
    var xmls = new XMLSerializer(); 

    // convert dom into string 
    var sResult = xmls.serializeToString(xmlFragment); 
    //extract contents of transform iix node if it is present 
    if (sResult.indexOf("<transformiix:result") > -1) 
    { 
     sResult = sResult.substring(sResult.indexOf(">") + 1, sResult.lastIndexOf("<")); 
    }  
    return sResult; 
} 

修订功能现在是:

function TransformToHtmlText(xmlDoc, xsltDoc) 
{ 
    // 1. 
    if (typeof (XSLTProcessor) != "undefined") 
    { 
     var xsltProcessor = new XSLTProcessor(); 
     xsltProcessor.importStylesheet(xsltDoc); 
     var xmlFragment = xsltProcessor.transformToFragment(xmlDoc, document); 

     if (typeof(GetXmlStringFromXmlDoc)!= "undefined") 
     {  
      return GetXmlStringFromXmlDoc(xmlFragment); 
     } 
     else 
     { 
      // chrome friendly 

      // get a xml serializer object 
      var xmls = new XMLSerializer(); 

      // convert dom into string 
      var sResult = xmls.serializeToString(xmlFragment); 
      //extract contents of transform iix node if it is present 
      if (sResult.indexOf("<transformiix:result") > -1) 
      { 
       sResult = sResult.substring(sResult.indexOf(">") + 1, sResult.lastIndexOf("<")); 
      }  
      return sResult; 
     } 
    } 
    // 2. 
    if (typeof (xmlDoc.transformNode) != "undefined") 
    { 
     return xmlDoc.transformNode(xsltDoc); 
    } 
    else { 

      var activeXOb = null; 
      try { activeXOb = new ActiveXObject("Msxml2.XSLTemplate"); } catch (ex) {} 

     try { 
      // 3 
      if (activeXOb) 
      { 
       var xslt = activeXOb; 
       var xslDoc = new ActiveXObject("Msxml2.FreeThreadedDOMDocument"); 
       xslDoc.loadXML(xsltDoc.xml); 
       xslt.stylesheet = xslDoc; 
       var xslProc = xslt.createProcessor(); 
       xslProc.input = xmlDoc; 
       xslProc.transform(); 

       return xslProc.output; 
      } 
     } 
     catch (e) 
     { 
      // 4 
      alert("The type [XSLTProcessor] and the function [XmlDocument.transformNode] are not supported by this browser, can't transform XML document to HTML string!"); 
      return null; 
     } 

    } 
} 
0

我有同样的问题,IE 9,没有答案的帮助,直到我不再试图加载使用jQueryxslt文件。我使用脚本加载了文件:https://msdn.microsoft.com/en-us/library/ms762796%28v=vs.85%29.aspx

我当时可以使用transformNode()函数。这里是他们给的脚本:

<HTML> 
<HEAD> 
    <TITLE>sample</TITLE> 
    <SCRIPT language = "javascript"> 
    function init() 
    { 
     var srcTree = 
      new ActiveXObject("Msxml2.DOMDocument.6.0"); 
     srcTree.async=false; 
     // You can substitute other XML file names here. 
     srcTree.load("hello.xml"); 

     var xsltTree = 
      new ActiveXObject("Msxml2.DOMDocument.6.0"); 
     xsltTree.async = false; 
     // You can substitute other XSLT file names here. 
     xsltTree.load("hello.xsl"); 
     resTree.innerHTML = srcTree.transformNode(xsltTree); 
    } 
    </SCRIPT> 
</HEAD> 

<BODY onload = "init()" > 
    <div id="resTree"></div> 
</BODY> 

</HTML> 
相关问题