使用带有联合的xPath选择节点

时间:2017-08-02 14:45:40

标签: php xpath

我正在编写基于使用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错误。

2 个答案:

答案 0 :(得分:1)

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

根据您的尝试,这里有几种可能性。

替代表达式

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

expression_one|expression_two

复杂条件

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

/location/path[condition and condition or condition]

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

axis::node[condition]

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

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

答案 1 :(得分:0)

尝试使用轴操作符...

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