1

我正在编写一个 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>

所以大写的节点是匹配的,但我想要实现的是标记所有的小写节点。

谢谢你的帮助

4

1 回答 1

8

您的原始 XPath 表达式

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

匹配作为 的后代的所有元素节点(<div id="menu">div匹配元素本身)。根据您所说的“逆”的确切含义,您可以尝试类似

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

它匹配所有没有祖先的元素节点 with id="menu",这将包括divwithid="menu"但不包括其子或孙。如果你也想排除div,使用ancestor-or-self::代替ancestor::


如果您有 XPath 2.0,那么对原始问题的更一般的答案是查看except运算符 - 在 XPath 2.0 中,您可以说X except Y选择与表达式匹配的所有节点,X但也不是Y

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

还有(由orunion匹配的节点) 和(both and ) 运算符。XYintersectXY

于 2013-03-04T11:44:48.897 回答