2013-03-04 84 views
0

我正在寫一個XPath和我寫文檔樹的XPath - 反向選擇

但我想所有其他元素相匹配,而不是匹配一些節點的XPath的,所以我想逆在整個文檔

的背景下,選擇讓我們說,我們有以下XPath

//*[@id='menu']//* 

和文件

<body> 
<div> 
    <h1>title</h1> 
</div> 
<div> 
<div id="menu"> 
    <UL> 
    <LI>home</LI> 
    <LI>about</LI> 
    </UL> 
</div> 
<div id="sidebar"> 
    <ul> 
    <li>one</li> 
    <li>two</li> 
    </ul> 
</div> 
<div> 
</body> 

所以大寫的節點是匹配的,但我想要實現的是標記所有的小寫節點。

感謝您的幫助

+1

DIV不匹配,順便說一句。 – choroba 2013-03-04 11:42:52

回答

6

你原來的XPath表達式

//*[@id='menu']//* 

比賽屬於<div id="menu">(但不元素div本身)的後裔所有元素節點。根據你的意思是由「逆」到底是什麼,你可以嘗試像

//*[not(ancestor::*[@id='menu'])] 

其中沒有一個祖先id="menu"所有元素節點相匹配,這將包括divid="menu"但不是它的子女或孫子女。如果要排除div爲好,用ancestor-or-self::代替ancestor::


如果你有XPath 2.0中則更爲普遍的回答你原來的問題是看except運營商 - XPath 2.0中,你可以說X except Y選擇由表達X匹配所有節點但不是也Y

//* except //*[@id='menu']//* 

也有通過任一X或匹配union(節點0)和intersect(均爲XY)運營商。

+0

如果您想排除DIV,則更改爲「祖先或自己」。 – choroba 2013-03-04 11:45:58

+0

@choroba我們倆在同一時間有同樣的想法:-) – 2013-03-04 11:47:05

+0

我們做到了。我準備發佈與你一樣的soltuion :) – choroba 2013-03-04 11:51:04