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

3

以下是一个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个回答

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()
//book[name(*[1]) = "title" and name(*[2]) = "price"]

第一个表达式 //book[title/following-sibling::price] 没有检查 title 是否是第一个子节点,因此它并没有回答这个问题!第二个表达式是正确的,但可能可以简化为 //book[name(*[1]) = "title"][name(*[2]) = "price"] - adamretter
@adamretter 嗯,严格来说第一种选项不完全符合OP的要求,但它在提供的示例上可以工作,而且我喜欢这个解决方案 :) 谢谢 - alecxe

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接