与其他浏览器相比,Xpath 函数 name() 在 Edge 中区分大小写不一致



问题:
在 Edge 中使用[name() = "SomeValue"]时,如果要匹配的"SomeValue"包含大写字母,则不会返回节点。即使这些大写字母与节点名称完全匹配。

示例:
我创建了这个JSFiddle,它表现出问题。它使用两个 XML 字符串,都是 MSDN 上书籍.xml示例的子集,其中第一个具有大写的节点名称,第二个我已修改为使用小写节点名称。摆弄更干净的代码。

当前结果:
在 Edge 中运行小提琴,您将看到在搜索"catalog"处于任何混合大小写[name() = "catalog"]时,XPath 仅在搜索词完全小写时才匹配节点。请注意,匹配节点的大小写并不重要,如果节点名称为驼峰大小写、全大写或全部小写,则术语"catalog"将匹配节点。

Edge 将匹配以下所有三个节点:

  • <Catalog/>
  • <CATALOG/>
  • <catalog/>

当在另一个浏览器中运行相同的浏览器时(我已经测试过Firefox,Chrome和Opera),搜索词必须与节点名称大小写完全匹配,并且是我期望XPath的工作方式。在上面的三个节点名称中,这些浏览器仅在使用[name() = "Catalog"]时与<Catalog/>匹配

预期结果:
我希望 Edge 的行为与其他浏览器相同,因为其他功能(如text())在 Edge 中不会以这种方式运行,这使得它更加不一致。这也显示在 JSFiddle 中。

我期望相同行为的另一个原因是,我所有测试的浏览器都只支持 XPath 1.0,所以那里应该没有区别。

总结:
这是Edge的缺陷吗?/这是标准允许的吗?如果不允许,我可以写一个错误报告给Microsoft。如果标准允许,我只需要考虑浏览器差异吗?

其他信息
使用 jQuery 支持现有软件,并寻找不需要额外第三方软件的解决方案。

XPath 1.0 是在特定的数据模型上定义的,该模型与 HTML DOM 不完全相同。特别是HTML5 DOM是在XPath 1.0被冻结多年后定义的。这意味着任何在HTML5 DOM上实现XPath 1.0的人都必须决定如何将HTML5 DOM映射到XPath数据模型。如果不同的供应商以不同的方式进行此映射,这是非常不幸的,但这实际上并不违反任何标准。在定义此映射时要做出的关键决策之一是如何处理 HTML5 不区分大小写而 XPath 1.0 区分大小写的事实。

这里的根本问题是你正在使用HTML5 DOM来保存不是HTML的东西。这是一个坏主意,因为HTML5会努力将您的内容弯曲到HTML5模型,这可能会以令人惊讶的方式损坏您的数据。为此数据创建一个 XML DOM 会好得多。

此外,无论如何,使用谓词[name()='SomeValue']都是不好的做法,因为 XPath 1.0 不保证name()函数的结果中的命名空间前缀。如果数据位于命名空间中,则最好使用self::SomeValueself::hh:SomeValue(尽管将 HTML5 映射到 XPath 数据模型的命名空间实例会引发另一组潜在问题。

建议:使用 Saxon-JS 作为 XPath 引擎。这样 (a) 您获得对 XPath 3.0 而不是 1.0 的支持,并且 (b) 您在每个浏览器上使用相同的 XPath 引擎,因此它将提供跨浏览器的兼容行为。

最新更新