如何在单独的树中返回节点的xpath联合?

时间:2014-07-31 01:21:38

标签: xpath

这是一个基本问题,但我无法在任何地方找到答案。

<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>

2 个答案:

答案 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。