2013-03-04 86 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