是否可以编写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
感谢您的任何建议
答案 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(.//*)]