4

所以我认为无论如何可能有比我正在做的更清洁的解决方案,但我想知道这是否是一个已知问题,是否有明显的我做错的事情,等等......

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

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

4

2 回答 2

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

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

于 2012-07-09T16:55:59.150 回答
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 将完成所有元素的创建,但我决定发布以防其他人遇到类似问题。

于 2016-04-25T17:33:32.313 回答