XPath - 反转选择

Jan*_*cak 0 xslt xpath

我正在写一个xpath,我编写了xpath,它匹配文档树中的一些节点

但是我想要匹配所有其他元素,所以我想在整个文档的上下文中反转选择

所以我们假设我们有以下xpath

//*[@id='menu']//*
Run Code Online (Sandbox Code Playgroud)

和文件

<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>
Run Code Online (Sandbox Code Playgroud)

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

谢谢你的帮助

Ian*_*rts 7

你的原始XPath表达式

//*[@id='menu']//*
Run Code Online (Sandbox Code Playgroud)

匹配是的后裔所有元素节点<div id="menu">(但不是div元素本身).根据你所说的"逆"你的意思,你可以尝试类似的东西

//*[not(ancestor::*[@id='menu'])]
Run Code Online (Sandbox Code Playgroud)

它匹配所有没有祖先的元素节点,id="menu"包括divwith id="menu"但不包括其子节点或孙子节点.如果您也想要排除div,请使用ancestor-or-self::而不是ancestor::


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

//* except //*[@id='menu']//*
Run Code Online (Sandbox Code Playgroud)

也有union(通过匹配的节点XY)和intersect(均为XY)运算符.