XPathで a を祖先に持たない b を選択する

最初はXPath2.0のexcept使えないと無理じゃないか?って思っていたけど、よくよく考えたらそんなことなかったのでメモ。(きっとまた忘れると思うので、、、)

たとえば下記のようなXMLがあったとして

<root>
  <a>
    <c>
      <b />
    </c>
  </a>
  <c>
    <b />
  </c>
</root>

aを祖先に持たないbだけを取りたいってときは、XPathは下記のように書ける。

//b[not(ancestor::a)]

ancestorはコンテキストノードの祖先の集合なので、そこにaが無いもの(not)といった指定になる。