xpath:具有相同名称

时间:2017-05-04 12:05:38

标签: xpath xpath-2.0

是否可以编写Xpath exression来查找以下节点:

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

感谢您的任何建议

2 个答案:

答案 0 :(得分:1)

对于以下输入:

<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是您要选择的。{/ p>

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

答案 1 :(得分:0)

问题并不完全清楚,但您可以尝试使用以下表达式:

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

这应该允许匹配没有自己孩子的c,并且是[{1}}的后代,有a后代,但不是b

更新

你可以尝试

e

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