xpath - 如何在单独的树中返回节点的xpath并集?

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

最佳答案

如果要选择所有离开节点(没有子节点的节点),则可以尝试以下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/

相关文章:

python lxml xpath : how to get this predicate working

javascript - 对存储在变量中的 xml 运行 Xpath(获取 "Uncaught TypeError: undefined is not a function")

datetime - 将日期时间转换为 xslt 中的 unix 纪元

html - 如何找到框架集中元素的 XPath?

java - org.jsoup.select.Selector$SelectorParseException : Could not parse query

xpath - XQUERY:查找另一个查询中出现的次数

css - 使用 XPATH 和 CSS 设置特定元素的样式

selenium - 使用 xpath (Selenium Webdriver) 确认嵌套 WebElement 的存在

javascript - 使用 XPATH Javascript 获取 XML 片段

java - 如何通过 Selenium Webdriver 和 Java 根据 html 单击弹出窗口内的按钮