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。
是否可以编写 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。