与其他浏览器相比,Edge中Xpath函数名()的大小写敏感度不一致
问题:与其他浏览器相比,Edge中Xpath函数名()的大小写敏感度不一致,xpath,microsoft-edge,Xpath,Microsoft Edge,问题: 在Edge中使用[name()=“SomeValue”]时,如果要匹配的“SomeValue”包含大写字母,则不会返回节点。即使这些大写字母与节点名称完全匹配 示例: 我创建了JSFiddle,它显示了问题。它使用两个XML字符串,都是MSDN上books.XML示例的子集,其中第一个使用大写的节点名称,第二个使用小写的节点名称 当前结果: 在Edge中运行fiddle,您将看到在搜索[name()=“catalog”]时,如果“catalog”的大小写混合,则XPath将仅在搜索词完全
在Edge中使用
[name()=“SomeValue”]
时,如果要匹配的“SomeValue”
包含大写字母,则不会返回节点。即使这些大写字母与节点名称完全匹配
示例:我创建了JSFiddle,它显示了问题。它使用两个XML字符串,都是MSDN上books.XML示例的子集,其中第一个使用大写的节点名称,第二个使用小写的节点名称 当前结果:
在Edge中运行fiddle,您将看到在搜索
[name()=“catalog”]
时,如果“catalog”
的大小写混合,则XPath将仅在搜索词完全小写时匹配节点。请注意,匹配节点的大小写并不重要,如果节点名称为驼峰大小写、大写或全小写,则术语“catalog”
将匹配节点
边缘将匹配以下三个节点:
[name()=“Catalog”]
预期结果:我希望Edge的行为与其他浏览器相同,因为像
text()
这样的其他函数在Edge中不以这种方式运行,这使得它更加不一致。JSFIDLE中也显示了这一点
我期望出现相同行为的另一个原因是,所有经过测试的浏览器都只支持XPath 1.0,因此应该没有区别
总而言之:这是边缘缺陷吗?/这是标准允许的吗?如果这是不允许的,我可以写一个错误报告给微软。如果标准允许,我是否只需要考虑浏览器差异 其他信息
使用jQuery支持现有软件,并寻找不需要额外第三方软件的解决方案 XPath 1.0是在特定的数据模型上定义的,它与HTML DOM不完全相同。尤其是HTML5DOM是在XPath1.0冻结多年后定义的。这意味着任何在HTML5DOM上实现XPath1.0的人都必须决定如何将HTML5DOM映射到XPath数据模型。如果不同的供应商以不同的方式进行映射,这是非常不幸的,但这实际上并没有违反任何标准。定义此映射时需要做出的关键决策之一是如何处理HTML5不区分大小写而XPath 1.0区分大小写这一事实 这里潜在的问题是,您正在使用HTML5DOM来保存非HTML的内容。这是一个坏主意,因为HTML5试图将您的内容弯曲到HTML5模型,这可能会以令人惊讶的方式损坏您的数据。最好为这些数据创建一个XMLDOM 另外,使用谓词
[name()='SomeValue']
无论如何都是不好的做法,因为XPath 1.0不保证name()
函数结果中的命名空间前缀。如果数据位于命名空间中,则最好使用self::SomeValue
或self::hh:SomeValue
(尽管HTML5到XPath数据模型的命名空间实例的映射会引发另一组潜在问题)
建议:使用Saxon JS作为XPath引擎。这样一来,(a)您可以获得对XPath 3.0而不是1.0的支持,(b)您在每个浏览器上使用相同的XPath引擎,因此它可以提供跨浏览器的兼容行为。接下来的问题是:当您说“XML DOM”与HTML5 DOM时,是否有您知道的Edge或jQuery本机容器?或者Edge使用的所有文档(甚至是jQuery创建的文档,因为它使用本机解析引擎)都将基于HTML5吗?不幸的是,我无法添加任何我们尚未使用的第三方软件。谢谢你的详尽回答!据我所知,您已经完全重写了示例代码,而JSFIDLE(据我所知)中没有关于前面代码的记录。这意味着我的答案是基于一个完全不同的问题,而这个问题已经不可理解了。这就是为什么StackOverflow强烈反对依赖外部站点链接的问题。我很想继续调查,但如果没有准确的对话历史记录,我就不能这样做。我已还原了原始链接,如果您仍想继续,我已将更新的链接移到段落末尾。很抱歉给您带来不便。