2013-07-23 184 views
0

我有一個多級<ul> <li>菜單結構。我試圖獲得具有後代LI的最高級別的LI,其類別爲「當前菜單行」。php xpath查找具有特定屬性的後裔節點

我的HTML

<ul id="menu1" class="nav"> 
    <li class="menu-item dorment-menu-item"><a href="http://localhost/index.html">welcome</a></li> 
    <li class="menu-item dorment-menu-item"><a href="http://localhost/evidence.html">evidence</a></li> 
    <li class="menu-item dorment-menu-item"><a href="http://localhost/network.html">network</a></li> 
    <li class="menu-item dorment-menu-item"><a href="http://localhost/multi-page-pc-22.html">Multi page</a> 
    <ul class="subnav"> 
     <li class="menu-item current-menu-line"><a href="http://localhost/new-page-1-pg-47.html">page 1</a></li> 
    </ul> 
    </li> 
</ul> 

我已經嘗試了一些XPath查詢來獲得具有後代沒有成功的最頂層<li>

$query = '//li[contains(@class, "current-menu-line")]'; // this one works ... makes sure LI.current-menu-line can be found 
$query = '/ul/li[li[contains(@class, "current-menu-line")]]'; // returns 0 rows 
$query = '/ul/li[//li[contains(@class, "current-menu-line")]]'; // returns 0 rows 
$query = '/ul/li[descendant::li[contains(@class, "current-menu-line")]]'; // returns 0 rows 

//檢查後添加「選擇具有元素某些後代使用Xpath「

$query = '/ul/li[.//li[contains(@class, "current-menu-line")]]' ; // returns 0 nodes 
$query = "/ul/li[descendant::li[@class, 'current-menu-line')]]"; // invalid query 

是有的能夠告訴我正確的查詢來獲得正確的LI?

乾杯

+0

簡單的破解,假設目標li總是等於2的類:'// li [contains(@class,'current-menu-line')] /../ ..' –

+0

好的答案,不幸的是我不能保證UL結構只有2深 – burtzerk

+0

[選擇具有某些後代使用Xpath的元素]的可能重複(http://stackoverflow.com/questions/17237312/select-elements-which-has-certain- descendent-using-xpath) –

回答

1

這個選擇應該適合你的描述:

/ul/li[.//li[contains(@class, 'current-menu-line')]] 

我看到你已經嘗試過這一點,它不適合您返回任何節點,但我懷疑有可能是在一個差異XML提供給您使用的實際XML。我使用an online XPath evaluator驗證了XPath,即使嵌套結構低於兩層以上,它也會返回正確的結果。

+0

感謝您的tfoo。正如你所說,我已經嘗試過它並沒有奏效。我直接從您的建議中複製/粘貼,但仍然無法使用。這表明這是PHP的問題,而不是DOMXpath。 我使用的確切代碼是 – burtzerk

相關問題