xpath:具有相同名称的嵌套节点
是否可以编写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
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