ie9的transformNode函数

时间:2013-09-12 18:18:13

标签: javascript jquery html xml xslt

我需要在ie9或更高版本中使用xslt将xml doc转换为另一个xml doc。

我正在尝试使用ie9中的xslt转换xml文档。当我使用transformNode()函数时,它在ie8(code :: resultDocument = XML.transformNode(XSL);)中工作正常,但在ie9中没有定义transformNode函数,显示错误:: SCRIPT438:对象不支持属性或方法'transformNode'

我找到了ie9的解决方案,如下所示

if (window.ActiveXObject) {
                console.log('inside hi');
                var xslt = new ActiveXObject("Msxml2.XSLTemplate");
                var xslDoc = new ActiveXObject("Msxml2.FreeThreadedDOMDocument");
                xslDoc.loadXML(xsltDoc.xml);
                console.log(xslt.styleSheet);
                xslt.stylesheet = xslDoc;
                var xslProc = xslt.createProcessor();
                xslProc.input = xmlDoc;
                xslProc.transform();
                return xslProc.output;
            }

但是当我运行这个时,我收到一个错误: SCRIPT16389:样式表不包含文档元素。样式表可能为空,也可能不是格式良好的XML文档。

我是javascript / jquery的新手。任何人都可以帮我解决这个问题。如果在javascript或jquery中有任何其他功能,那将会有所帮助。

提前致谢

2 个答案:

答案 0 :(得分:1)

对于早期版本的IE,responseXML文档曾经是MSXML DOM文档,MSXML实现了XSLT和transformNode。对于较新的IE版本,responseXML文档为您提供IE DOM文档,IE不为其DOM文档/节点实现XSLT和transformNode。 IE DOM文档也没有您尝试在xml中使用的属性xslDoc.loadXML(xsltDoc.xml);

尝试将代码的这一部分更改为

if (typeof XMLSerializer !== 'undefined') {
  xslDoc.loadXML(new XMLSerializer().serializeToString(xsltDoc));
  // now use xslDoc here
}

如果您仍然可以访问XMLHttpRequest,则另一个选项是使用xslDoc.loadXML(xmlHttp.responseText);。还有一个选项可以确保您获得MSXML responseXML,请参阅http://blogs.msdn.com/b/ie/archive/2012/07/19/xmlhttprequest-responsexml-in-ie10-release-preview.aspx中的try { xhr.responseType = 'msxml-document'; } catch(e){}行。

您的代码中对象检查的整个方法是错误的,检查您要使用的对象或属性或方法(例如if (typeof XSLTProcessor !== 'undefined') { // now use XSLTProcessor here }),而不是像document.implementation那样完全不同的对象。

答案 1 :(得分:0)

我在IE9 / 10/11中也遇到SCRIPT16389: The stylesheet does not contain a document element. The stylesheet may be empty, or it may not be a well-formed XML document错误。我发现以下修复它:

您的代码:

if (window.ActiveXObject) {
    console.log('inside hi');
    var xslt = new ActiveXObject("Msxml2.XSLTemplate");
    var xslDoc = new ActiveXObject("Msxml2.FreeThreadedDOMDocument");

    xslDoc.loadXML(xsltDoc.xml);

    console.log(xslt.styleSheet);
    xslt.stylesheet = xslDoc;
    var xslProc = xslt.createProcessor();
    xslProc.input = xmlDoc;
    xslProc.transform();
    return xslProc.output;
 }

工作代码:

if (window.ActiveXObject) {
    console.log('inside hi');
    var xslt = new ActiveXObject("Msxml2.XSLTemplate");
    var xslDoc = new ActiveXObject("Msxml2.FreeThreadedDOMDocument");

    xslDoc.load(xsltDoc);

    console.log(xslt.styleSheet);
    xslt.stylesheet = xslDoc;
    var xslProc = xslt.createProcessor();
    xslProc.input = xmlDoc;
    xslProc.transform();
    return xslProc.output;
 }

更改为第6行 - 将'loadXML'替换为'load',将'xsltDoc.xml'替换为'xsltDoc'。让我知道它是怎么回事!