我正在编写基于使用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
错误。
答案 0 :(得分:1)
Xpath表达式用作过滤器。它们不会在那种意义上聚合/编译(就像SQL联盟一样)。
根据您的尝试,这里有几种可能性。
管道符号|
允许您指定多个表达式 - 它的作用类似于CSS选择器中的逗号,
。
expression_one|expression_two
表达式中的条件可以使用and
和or
以及括号。
/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 ')]