XPath - 反转选择

时间:2013-03-04 11:36:28

标签: xslt 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 个答案:

答案 0 :(得分:7)

您的原始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选择与表达式{{匹配的所有节点1}}但不是X

Y

还有//* except //*[@id='menu']//* (由unionX)和YintersectX}运营商匹配的节点。