2017-08-02 114 views
0

我正在編寫基於使用xPath操作數據的基本HTML報告模板系統。從本質上講,我需要一個xPath查詢,它將選擇一個節點或其子節點,如果他們有一個特定的類。使用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

通過節點或其孩子你的意思是節點和它的孩子? – akond

+0

我的意思是邏輯OR,如「Union」中所示。 – Philip

+0

父母和孩子都應該包含-delete-if-no-stock class? – akond

回答

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(...)]

0

使用軸操作的Try ...

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