XPath:匹配 'bar' 的 'foo' 个后代,但如果 'quux' 介于两者之间则不匹配

XPath: match 'foo' descendants of 'bar', but not if 'quux' is in between

在 XPath(仅限 1.0,拜托)中是否有可能找到 'bar' 的所有 'foo' 个后代,在 中的任何级别都没有 'quux'在之间?也就是说,例如,这些 'foo' 应该匹配:

<bar><foo/></bar>
<bar><a><foo/></a></bar>
<bar><a><b><c><d><e><f><g><foo/></g></f></e></d></c></b></a></bar>

但这些不应该:

<bar><quux><foo/></quux></bar>
<bar><a><quux><foo/></quux></a></bar>
<bar><quux><a><foo/></a></quux></bar>
<bar><a><quux><b><foo/></b></quux></a></bar>

quux 高于 bar 或低于 foo 的实例应该 而不是 阻止匹配,即这些 'foo's 应该匹配:

<bar><foo><quux/></foo></bar>
<quux><bar><foo/></bar></quux>

bar/not(quux)/foo 不起作用,因为它只接受三级结构。任何带有 // 的东西都会让 quux 在那个时候溜走。 bar//foo[not(ancestor::quux)] 几乎 有效,但当 quux 是 bar 的祖先时失败。

一种表达你想要的方式是 fooquux 祖先的数量与 fooquux 祖先的数量相同s bar 祖先,因此所有 quux 都是 barfoo.

的祖先

下面的表达式将select这样foos:

//bar//foo[count(./ancestor::quux) = count(./ancestor::bar/ancestor::quux)]