xpath:具有相同名称的嵌套节点

xpath: nested nodes with same name

是否可以编写 Xpath 表达式来查找以下节点:

a/b/c
a/b/b/c
a/b/b/b/c
a/b/b/b/.../b/.../b/c

等等

但不是

a/b/b/e/b/c

?

感谢任何建议

问题不是很清楚,但你可以尝试使用下面的表达式:

//a[.//b and not(.//e)]//c[not(.//*)]

这应该允许匹配没有自己的 child 并且是 a 的后代的 c,它有 b 个后代,但没有 e

更新

你可以试试

//a[count(.//b)=count(.//*)-count(.//c)]//c[not(.//*)]

//a[not(.//*[not(self::b)]//c)]//c[not(.//*)]

对于以下输入:

<root>
    <a><b><c>1</c></b></a>
    <a><b><b><c>2</c></b></b></a>
    <a><b><b><b><c>3</c></b></b></b></a>
    <a><b><b><e><b><c>4</c></b></e></b></b></a>
    <a><b><b><e><b><b><c>5</c></b></b></e></b></b></a>
</root>

你可以试试下面的表达方式:

//a[deep-equal(distinct-values(descendant::*[position()<last()]/name()), ('b'))]//c

工作原理:

对于任何 a,计算除最后一个后代以外的所有名称,并检查该名称的不同列表是否与仅包含 b 的列表相匹配。对于这样一个 a 后代 c 是你想要 select.

我使用 2010 版 XMLSpy 对其进行了测试,其中 returns c 元素包含 1、2 和 3。我认为更现代的工具也可以使用。但是为此您至少需要 XPath 2.0。