我正在写一个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>
所以上层节点是匹配的,但我想要实现的是标记所有小写节点。
感谢您的帮助
答案 0 :(得分:7)
您的原始XPath表达式
//*[@id='menu']//*
匹配作为<div id="menu">
后代的所有元素节点(但不 div
元素本身)。根据“逆”的具体含义,您可以尝试类似
//*[not(ancestor::*[@id='menu'])]
匹配所有没有祖先id="menu"
的元素节点,其中包括div
和id="menu"
但不包括其子孙。如果您还要排除div
,请使用ancestor-or-self::
代替ancestor::
如果您有XPath 2.0,那么对原始问题的更一般的回答是查看except
运算符 - 在XPath 2.0中,您可以说X except Y
选择与表达式{{匹配的所有节点1}}但不是X
Y
还有//* except //*[@id='menu']//*
(由union
或X
)和Y
(intersect
和X
}运营商匹配的节点。