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:SomeValue
如果数据在命名空间中(尽管HTML5到XPath数据模型的命名空间实例的映射会引发另一组潜在问题。)
建议:使用Saxon-JS作为XPath引擎。这样(a)你得到XPath 3.0而不是1.0的支持,并且(b)你在每个浏览器上使用相同的XPath引擎,因此它将提供跨浏览器的兼容行为。