XPath:选择在指定类型的指定位置具有子项的元素

时间:2014-05-12 13:25:14

标签: xml xpath

查看以下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]]

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

1 个答案:

答案 0 :(得分: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>

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

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