Xpath 解析中上下文节点的作用是什么?

<!DOCTYPE html>
<html lang="zh-CN">
<head>
  <meta charset="UTF-8">
</head>
<body>
  <div>
    hello world
    <span>你好世界</span>
    <span>你好世界</span>
  </div>
</body>
</html>

执行下面的代码

const xPathEvaluator = new XPathEvaluator()
const expression = xPathEvaluator.createExpression('/html/body')
console.log(expression.evaluate(document.querySelector('div')).iterateNext())
console.log(expression.evaluate(document).iterateNext())

evaluate 方法中第一个参数是上下文节点,以上执行的结果是相同的,都是 body 元素,请问一下这个上下文节点参数的作用是什么?

阅读 2.1k
2 个回答
✓ 已被采纳

比如 ../span 是根据你的 evaluate() 的节点作为初始入口来判断的。

evaluate 方法的第一个参数传递给了该表达式。这个上下文节点参数指定了 XPath 表达式执行的 起始点 或者搜索的范围。

只不过在题主这个例子中,刚好 不会 体现出变化

如果将上下文节点设置为 document.querySelector('div'),则表示从 div 元素开始执行 XPath 表达式。因此,在这种情况下,expression.evaluate(document.querySelector('div')).iterateNext() 的结果是 body 元素。

  • 首先,document.querySelector('div') 选择了文档中的 div 元素作为上下文节点
  • 然后,由于 div 内部没有 html 元素,因此无法匹配到 /html/body 这个路径。但是,在这种情况下,XPath 解析器会 自动向外 扩展搜索范围,并从整个文档的 根元素 开始进行搜索。因此,在最终结果中可以找到匹配 /html/body 的第一个符合条件的节点,也就是 body 元素

如果将上下文节点设置为 document,则表示从整个文档开始执行 XPath 表达式。所以 expression.evaluate(document).iterateNext() 的结果也是 body 元素。

可以看到,在题主的例子中,无论上下文节点是哪个元素( divdocument),XPath 表达式都会返回相同的结果 body 元素。因为/html/body 这个表达式本身就选择了 body 元素作为目标。

分析半天,还是 DOM 操作香啊

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题