嗨,我正在寻找一种方法,将使用ajax检索的XML文档呈现到新的浏览器窗口。
我正在使用JQuery的ajax()函数将JSON数据发布到MVC控制器。控制器将XML作为字符串返回。
我正在使用window.open()在javascript中创建一个新窗口,并通过调用设置文档内容。
newwindow.document.clear(); newwindow.document. newwindow.document.write(jqXHR.responseText); newwindow.document.close();
(其中jqXHR.responseText是从ajax()调用返回的XML。)
新窗口将按预期方式打开,如果我在页面上查看源代码,则会看到XML。但是(您知道有人要来了)浏览器窗口中什么也没有出现。显然,如果我将页面源保存到磁盘并打开,则输出将按预期呈现。
谁能提出解决方案?再次重申我的主要目标是将XML文档(通过ajax调用获得)呈现到新窗口。
我还应该补充一点,我希望看到XSLT转换的输出。我的XML具有此处理指令。非常感谢
编辑 ---------------------------我要使用的解决方案----------------- --------
感谢大家的意见和建议。
我最终使用的解决方案是创建一个带有target =“ _ blank”的表单,然后将JSON作为隐藏字段写入表单,然后将其发布到我的控制器,该控制器返回XML(由JSON构造)。从响应返回XML时,浏览器将其标记为预期的样子。我想这不是原始问题的答案。但是Gabby在下面有一个解决方案。
以下仅适用于 FireFox 和 Opera ,但我认为值得一提。
window.open('data:text/xml,' + encodeURIComponent( jqXHR.responseText ) );
应该也可以与chrome一起使用,但是它似乎与window.open通常的URL有所不同。
window.open
更新 这适用于所有浏览器!
事实是,javascript能够使用xslt转换xml。 但不是自动完成的,因此我们需要找到XML文件作为对XSLT文件的引用,并加载该文件。然后,我们可以使用javascript进行转换,并将生成的html传递到新窗口。
IE自然会处理其他事情。
$.get('xml-file-here.xml', function(xmlData){ var xml = xmlData; //extract the stylesheet so we can load it manually var stylesheet; for (var i=0;i<xml.childNodes.length;i++){ if ( xml.childNodes[i].nodeName =='xml-stylesheet' ) { stylesheet = xml.childNodes[i].data; } } var items = stylesheet.split('='); var xsltFile = items[items.length-1].replace(/"/g,''); //fetch xslt manually $.get( xsltFile, function(xsltData){ var xslt = xsltData; var transformed; if (! window['XSLTProcessor']) { // Trasformation for IE transformed = xml.transformNode(xslt); } else { // Transformation for non-IE var processor = new XSLTProcessor(); processor.importStylesheet(xslt); var xmldom = processor.transformToDocument(xml); var serializer = new XMLSerializer(); var transformed = serializer.serializeToString(xmldom.documentElement); } var newwindow = window.open(); newwindow.document.open(); newwindow.document.write(transformed); newwindow.document.close(); }); });