4

我正在开发一个使用 XPath 表达式从 XML 中选择节点的应用程序。我们注意到,在 Microsoft Edge 预览版中进行测试时,这似乎对我们不利。我已将我们的代码缩减为一个简短的片段来演示该问题:

var xml = "<xml id='relationships'><Relationships><f id='some_id' ><f id='some_other_id' /></f></Relationships></xml>";
var doc = (new DOMParser).parseFromString(xml, "text/xml");
var nodes = doc.evaluate("//f[@id='some_id' and f]", doc, doc.createNSResolver(doc.documentElement), XPathResult.ORDERED_NODE_SNAPSHOT_TYPE, null);
console.log(nodes.snapshotLength);

在 Chrome 中,这将注销1并且nodes.snapshotItem将包含正确的节点,但在 Edge 中,它正在注销0并且不返回任何节点。

如果我单独运行此条件的一半,"//f[@id='some_id']"或者"//f[f]",它在浏览器中始终如一地工作,并且 Edge 返回正确的节点。只有当这两个条件(对于所讨论的节点都为真)与and. 我无论如何都不是 XPath 专家,所以任何人都可以告诉我我是否在这个片段中做任何非标准的事情,或者这看起来像是 Edge 预览的 XPath 实现的问题吗?

4

2 回答 2

4

更新:此问题已在 2015 年 11 月的 Windows/Edge 更新中得到解决

这似乎是Microsoft Edge中当前实现的一个错误。但是,我确实注意到,如果您翻转条件,则会检索到正确的元素:

//f[f and @id='some_id']

目前,我希望这是一个可以接受的替代方案。我正在为我们的团队打开一个错误以供我们审查。感谢您帮助我们改进 Microsoft Edge :)

于 2015-06-11T18:40:47.920 回答
3

在 Edge 中失败的 XPaths 后跟类似的替代方案:

失败

'/value[Name/text()="Checked"]/Value[text()="true"]'

选择

'/value[Name ="Checked" and Value = "true"]/Value'

失败

'/value[text()="match1"]' 

选择

'/value[.="match1"]'

失败

'/value[Name[text()="match1"]]'

选择

'/value[Name="match1"]'

失败

'/value[Name/text()= "match1"]'

选择

'/value[Name= "match1"]'

失败

'/value[Name[text() = 'match1']]')

选择

'/value[Name = "match1"]')
于 2015-10-16T14:50:46.823 回答