DOMParser或XMLSerializer都在IE9中删除我的名称空间声明

时间:2012-07-09 15:59:42

标签: javascript xml xslt internet-explorer-9 xml-namespaces

所以我认为可能比我正在做的更清晰的解决方案,但我想知道这是否是一个已知的问题,如果有一些明显我做错了等等......

由于不值得描述的原因,我有一些Javascript代码,在一个可能的路径中,使用DOMParser从字符串加载XML,然后使用XMLSerializer将其序列化回字符串。 XML文档是XSL样式表。主xsl:stylesheet标记中有两个xmlns元素:一个声明xsl命名空间,另一个声明我使用的自定义命名空间。 (称之为“foo”)

在IE9中,至少,当我通过DOMParser从往返返回输出时,xmlns:xsl元素仍然存在,但缺少xmlns:foo元素。这是预期的行为吗?我错过了什么?

2 个答案:

答案 0 :(得分:1)

我做了一个测试用例http://home.arcor.de/martin.honnen/javascript/2012/test2012070901.html,我可以确认Windows 7上IE 9的输出是

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显示什么?

[edit] IE 10上存在连接问题,可能与:https://connect.microsoft.com/IE/feedback/details/728093/xmlserializer-omits-xmlns-attributes相关。

答案 1 :(得分:0)

我也遇到过这个问题。在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会完成所有元素创建,但我决定发布以防其他人遇到类似问题。