DOMParser или XMLSerializer удаляют мое объявление пространства имен в IE9
Поэтому я думаю, что, возможно, есть более чистые решения, чем то, что я делаю в любом случае, но мне интересно, если это известная проблема, если есть что-то очевидное, я делаю неправильно, и т. Д...
По причинам, которые не стоит описывать, у меня есть некоторый код Javascript, который по одному из возможных путей загружает XML из строки с использованием DOMParser, а затем сериализует его обратно в строку с помощью XMLSerializer. Документ XML представляет собой таблицу стилей XSL. В основном теге xsl:stylesheet есть два элемента xmlns: один, который объявляет пространство имен xsl, а другой - пользовательское пространство имен, которое я использую. (Назовите это "фу")
По крайней мере, в IE9, когда я возвращаю выходные данные из двустороннего цикла через DOMParser, элемент xmlns:xsl все еще там, но элемент xmlns:foo отсутствует. Это ожидаемое поведение? Что мне не хватает?
2 ответа
Я сделал тестовый пример http://home.arcor.de/martin.honnen/javascript/2012/test2012070901.html и могу подтвердить, что выходные данные с IE 9 на Windows 7
Input
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="1.0" xmlns:foo="http://example.com/foo">
<xsl:template match="foo:bar">Test</xsl:template>
</xsl:stylesheet>
Output
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="1.0">
<xsl:template match="foo:bar">Test</xsl:template>
</xsl:stylesheet>
поэтому объявление пространства имен отбрасывается. Я считаю, что это ошибка в IE 9, вы можете проверить connect.microsoft.com, есть ли что-то подобное уже сообщалось, и если нет, подать его. Кто-нибудь читает здесь, используя IE 10? Что показывает IE 10?
[править] В IE 10 существует проблема с подключением, вероятно, связанная с: https://connect.microsoft.com/IE/feedback/details/728093/xmlserializer-omits-xmlns-attributes.
Я также испытывал эту проблему. В IE11 у меня был некоторый javascript, сериализующий XML, и URI пространства имен были отброшены.
В качестве обходного пути я использовал createElementNS
метод при создании соответствующего дочернего узла.
Так, например, вместо...
var r = '<soap:Envelope xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/" xmlns:n0="web5540"></soap:Envelope>';
var m = new DOMParser().parseFromString(r, "text/xml");
var n = m.createElement('n0:GetSales');
var p = m.firstChild;
p.appendChild(n);
var k = new XMLSerializer().serializeToString(m);
// In IE, k = "<soap:Envelope xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/" ><n0:GetSales /></soap:Envelope>"
... Я заканчиваю тем, что делаю это...
var r = '<soap:Envelope xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/"></soap:Envelope>';
var m = new DOMParser().parseFromString(r, "text/xml");
var n = m.createElementNS('web5540', 'n0:GetSales');
var p = m.firstChild;
p.appendChild(n);
var k = new XMLSerializer().serializeToString(m);
// In IE, k = "<soap:Envelope xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/"><n0:GetSales xmlns:n0="web5540" /></soap:Envelope>"
Я не уверен, что это поможет в исходном случае, так как DOMParser будет делать все создание элемента, но я решил опубликовать в случае, если у кого-то еще есть аналогичная проблема.