我需要在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中有任何其他功能,那将会有所帮助。
提前致谢
答案 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'。让我知道它是怎么回事!