【问题标题】:Selecting Nodes using xPath with unions使用带联合的 xPath 选择节点
【发布时间】:2017-08-02 14:45:39
【问题描述】:

我正在编写一个基于使用 xPath 操作数据的基本 HTML 报告模板系统。本质上,我需要一个 xPath 查询,如果它们有某个类,它将选择一个节点或其子节点。

$query = $xPath->query (".//*[contains(concat(' ', normalize-space(@class), ' '), ' -delete-if-no-stock ')]", $node);

我了解 xPath 选择器.//*[contains(concat(' ', normalize-space(@class), ' '), ' -delete-if-no-stock ')] 专门查看$node 参数的后代节点

我想要一个本质上询问“节点或其任何子节点”的 xPath 查询。我知道有一个联合运算符|,但我还没有看到如何实现它。我会想到这样的事情:.[contains(concat(' ', normalize-space(@class), ' '), ' -delete-if-no-stock ')] | .//*[contains(concat(' ', normalize-space(@class), ' '), ' -delete-if-no-stock ')] 但这会产生Invalid expression 错误。

【问题讨论】:

  • 节点或其子节点是指节点及其子节点?
  • 我的意思是逻辑或,如“Union”。
  • 父母和孩子都应该包含 -delete-if-no-stock 类?
  • @akond 父子类可以包含 -delete-if-no-stock

标签: php xpath


【解决方案1】:

Xpath 表达式用作过滤器。它们不会在那种意义上聚合/编译(就像 SQL 联合一样)。

这里有几种可能性,具体取决于您要执行的操作。

替代表达

管道符号 | 允许您指定多个表达式 - 它的工作方式类似于 CSS 选择器中的逗号 ,

expression_one|expression_two

复杂的条件

表达式中的条件可以使用andor以及括号。

/location/path[condition and condition or condition]

Xpath 表达式有一个轴的概念,它定义了过滤器应用到的初始节点集。

axis::node[condition]

.//*self::node()/descendant::* 的缩写。这是一个名为 descendant-or-self 的轴,其中包括当前节点和所有后代。

descendant-or-self::*[contains(...)]

【讨论】:

    【解决方案2】:

    尝试使用轴运算符...

    descendant-or-self::node()[contains(concat(' ', @class, ' '), ' -delete-if-no-stock ')]
    

    【讨论】:

      猜你喜欢
      • 2013-11-28
      • 1970-01-01
      • 2011-10-11
      • 2017-02-17
      • 2016-09-06
      • 2014-10-10
      • 2013-04-25
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多