这是一个基本问题,但我无法在任何地方找到答案。
<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>
答案 0 :(得分:2)
如果您打算选择所有离开节点(没有子节点的节点),您可以尝试使用此XPath:
//*[not(*)]
或使用XPath union(|
)获取<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>
答案 1 :(得分:2)
XPath只能返回源树中已存在的节点。要构造新节点或重新组织树,您需要XSLT或XQuery。