问题:
在Edge中使用[name() = "SomeValue"]
时,如果要匹配的"SomeValue"
包含大写字母,则不会返回节点。即使这些大写字母与节点名称完全匹配。
示例:
我创建了 this JSFiddle,它表现出问题。它使用两个XML字符串,这两个字符串都是MSDN上books.xml示例的子集,其中第一个具有大写节点名称,第二个我已修改为使用小写节点名称。 Fiddle with cleaner code.
当前结果:
在Edge中运行小提琴,您将在搜索[name() = "catalog"]
时看到"catalog"
处于任何混合情况,只有当搜索词完全小写时,XPath才会匹配节点。请注意,匹配节点的情况并不重要,如果节点名称为驼峰大小写,全部大写或全部小写,则术语"catalog"
将匹配节点。
Edge将匹配所有这三个节点:
<Catalog/>
<CATALOG/>
<catalog/>
在另一个浏览器中运行相同的浏览器(我已经测试过Firefox,Chrome和Opera)时,搜索词必须完全匹配节点名称的大小写,这就是我期望XPath运行的方式。在使用<Catalog/>
[name() = "Catalog"]
预期结果:
我希望Edge的行为与其他浏览器相同,因为其他功能如text()
不会在Edge中以这种方式运行,这使得它更加不一致。这也显示在JSFiddle中。
我期望相同行为的另一个原因是,我所有经过测试的浏览器都只支持XPath 1.0,因此应该没有区别。
总结:
这是Edge中的缺陷吗? /标准是否允许这样做?如果不允许,我可以向Microsoft写一个错误报告。如果标准允许,我只需要考虑浏览器的差异吗?
其他信息
使用jQuery支持现有软件,并寻找不需要额外第三方软件的解决方案。
答案 0 :(得分:0)
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::SomeValue
或self::hh:SomeValue
要好得多(尽管HTML5到XPath数据模型的命名空间实例的映射会引发另一组潜在问题。)
建议:使用Saxon-JS作为XPath引擎。这样(a)你得到XPath 3.0而不是1.0的支持,并且(b)你在每个浏览器上使用相同的XPath引擎,因此它将提供跨浏览器的兼容行为。