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

xpath:具有相同名称的嵌套节点,xpath,xpath-2.0,Xpath,Xpath 2.0,是否可以编写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(.//*)] //a[deep-equal(distinct-values(descendant::*[position()<last()]/name()), ('b'))]//c

是否可以编写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(.//*)]
//a[deep-equal(distinct-values(descendant::*[position()<last()]/name()), ('b'))]//c
这应该允许匹配没有自己孩子的
c
,它是
a
的后代,它有
b
后代,但不是
e

更新

你可以试试

//a[count(.//b)=count(.//*)-count(.//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>

1.
2.
3.
4.
5.
您可以尝试以下表达式:

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

//a[deep equal(不同的值)(后代::*[position()你的意思是类似于正则表达式
ab+c
?我认为单用xpath无法实现这一点。你的要求似乎表明最终结果不应该包含
e
,在这种情况下,你应该使用xslt转换xml以删除
e
,你可以在其上运行xpath。@ceving正是我想要的只有名为b的标签位于a和cCheck更新答案之间,如果问题仍然存在,请告知le