问题描述
根据我对XPath的理解,对于任何HTML或XML文档:$x("/node()")
表示$x("/child::node()")
,表示返回上下文节点的子节点。在此,根节点(/)
是上下文节点。因此,它返回html
元素。
$x("node()")
的意思是$x("child::node()")
,它也返回相同的html
元素。但是在这种情况下,与上述情况不同,我们没有提供上下文节点。那么,在这种情况下如何识别上下文节点?
上面的XPath表达式在语法和功能上都是相同的。
解决方法
区别在于/node()
绝对将上下文节点指定为文档根(/
),而node()
依赖于隐式相对上下文节点。
如何确定隐式相对上下文节点?好吧,基于上下文。 ;-)
例如,托管语言通常会将初始上下文节点设置为要匹配或迭代的当前节点。然后,在对XPath本身的评估中,每个定位步骤(以斜杠/
分隔)将为后续步骤建立上下文节点。
Chrome控制台中使用的$x(path,[startNode])
表示法带有一个可选的第二个参数,可用于显式指定上下文节点。默认情况下,它等于文档根节点,这导致观察到的行为,其中$x("node()")
和$x("/node()")
返回给定文档的结果相同。
上面的XPath表达式在语法和功能上都是相同的。
node()
和child::node()
显然在语法上是不同的,但是,是的,它们在语义上是 (或在功能上是 ,就像您说的一样),因为child::
轴是默认轴。