Вопрос по internet-explorer-10, javascript – Объект не поддерживает свойство или метод transformNode в Internet Explorer 10 (Windows 8)

5

У меня возникают некоторые проблемы с JavaScript, которые возникают только в Internet Explorer 10 в Windows 8 (IE 7, 8 и 9 работают нормально). Основная суть того, что я делаю, это получение XML и XSL из веб-службы, а затем преобразование их в JavaScript для отображения на странице с использованием объекта Sys.Net.XMLDOM.

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, я получаю:

Object doesn't support property or method 'transformNode'

Любые идеи о том, почему Internet Explorer 10 делает это?

EDIT

Я также попробовал это:

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 я получаю:

Reference to undeclared namespace prefix: 'atom'.

Ваш Ответ

4   ответа
0

спасибо Роэлю ван Лисдонку, который опубликовал функцию, которой поделилась Шейх Хира.

Я обнаружил, что эта функция не работает в 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;
        }

    }
}
4

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

IE 10 требует использования XMLHttpRequest с типом responseType, установленным как «msxml-document». Как только я переключил код на это, все отлично работает во всех браузерах:

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();
Как бы вы добавили XML в XMLHttRequest. Рассматриваемый контекст и ответ не совпадают. Я новичок, пожалуйста, уточните ответ в соответствии с вопросом. Я сталкиваюсь с аналогичной проблемой "Ссылка на необъявленный префикс пространства имен:" atom ". & Quot;
1

и ни один из ответов не помог, пока я не перестал пытаться загрузитьxslt использование файлаjQuery, Я загрузил файл со скриптом, как описано в: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>
4

нашел в Интернете)

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);
Кстати, все это прекрасно работает в IE9, поэтому я думаю, что есть новый поворот во всем этом в IE10. Просто не уверен что. John Chapman
У меня сработало Win7 + IE10. Спасибо.
Я тоже, может быть, вы можете гуглить об этом, спасибо!
@JohnChapman,Check thisможет быть полезным.
Мне нравится это решение. Тем не менее, с этим я получаю «ссылку на необъявленный префикс пространства имен:« атом ».» сообщение об ошибке. John Chapman

Похожие вопросы