这是一个基本问题,但我找不到任何答案。
<a>
<b1>
<d1>D1</d1>
<e1>E1</e1>
</b1>
<b2>
<c2>
<d2>D2</d2>
<e2>E2</e2>
</c2>
</b2>
</a>
从以上我想返回:
<a>
<d1>D1</d1>
<e1>E1</e1>
<d2>D2</d2>
<e2>E2</e2>
</a>
并不是:
<a>
<b1>
<d1>D1</d1>
<e1>E1</e1>
</b1>
<b2>
<d2>D2</d2>
<e2>E2</e2>
</b2>
</a>
如果那有意义的话。我尝试了“ / a”,但这给了我:
<a>
<b1>
<d1>D1</d1>
<e1>E1</e1>
</b1>
<b2>
<c2>D2E2</c2>
</b2>
</a>
最佳答案
如果要选择所有离开节点(没有子节点的节点),则可以尝试以下XPath:
//*[not(*)]
或使用XPath联合(
|
)获得<b1>
和<c2>
的子节点:(//b1/* | //c2/*)
给定您发布的示例XML,以上两个XPath都将返回:
<d1>D1</d1>
<e1>E1</e1>
<d2>D2</d2>
<e2>E2</e2>
但是,如果您真的需要将结果包装在
<a>
中,那么我同意@minopret注释,这不是XPath要做的。 XSLT是将XML转换为不同格式的更合适的方法。更新:
为了回应您的最后评论,XPath中没有这样的分组。如果需要该数据结构,应使用宿主语言完成。最好的选择是在XPath中选择所需节点的父节点,以便按其父节点对它们进行分组。然后,您可以使用宿主语言进行进一步处理,例如:
//*[not(*)]/parent::*
//*[*[not(*)]]
以上两个XPath查询中的任何一个都可以返回:
<b1>
<d1>D1</d1>
<e1>E1</e1>
</b1>
<c2>
<d2>D2</d2>
<e2>E2</e2>
</c2>
关于xpath - 如何在单独的树中返回节点的xpath并集?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25049515/