【问题标题】:XPath: Selecting elements having a child at a specified position of a specified typeXPath:选择在指定类型的指定位置具有子元素的元素
【发布时间】:2014-06-29 21:23:45
【问题描述】:

查看以下 XML 示例:

<bookstore>
    <book>
        <title lang="eng">Harry Potter</title>
        <price>29.99</price>
    </book>
    <book>
        <price>39.95</price>
        <title lang="eng">Learning XML</title>
    </book>
</bookstore> 

使用 XPath 我不想选择第一个孩子是标题元素而第二个孩子是价格元素的所有书籍。这将返回示例中的第一本书。

我尝试了以下表达式:

book[title[1] and price[2]]

但是这个表达式不匹配,因为它选择了所有至少有一个标题元素和至少两个价格元素的书。如何更改此表达式以选择所有书籍,其中第一个孩子是标题元素,第二个孩子是价格元素?

【问题讨论】:

    标签: xml xpath


    【解决方案1】:

    您可以通过获取title 子级并检查是否有以下price 兄弟级来做到这一点:

    //book[title/following-sibling::price]
    

    演示(使用xmllint):

    $ xmllint input.xml --xpath '//book[title/following-sibling::price]'
    <book>
            <title lang="eng">Harry Potter</title>
            <price>29.99</price>
    </book>
    

    另一种方法是检查book 节点的第一个和第二个子节点的name()s:

    //book[name(*[1]) = "title" and name(*[2]) = "price"]
    

    【讨论】:

    • 第一个表达式//book[title/following-sibling::price] 根本不检查title 是第一个孩子,所以它没有回答问题!第二个表达式是正确的,但可以简化为//book[name(*[1]) = "title"][name(*[2]) = "price"]
    • @adamretter 是的,严格来说,第一个选项并不是 OP 真正想要的,但它适用于提供的示例,而且我喜欢该解决方案 :) 谢谢
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-07-19
    相关资源
    最近更新 更多