如何使用XPath选择具有特定属性的第一个元素

XPath bookstore/book[1]选择bookstore下的第一个图书节点。

如何选择第一个匹配更复杂条件的节点,例如,第一个匹配/bookstore/book[@location='US']的节点

539962 次浏览

使用:

(/bookstore/book[@location='US'])[1]

这将首先获得位置属性为'US'的book元素。然后它将从该集合中选择第一个节点。注意括号的使用,这是一些实现所需要的。

注意,这与/bookstore/book[1][@location='US']不同,除非第一个元素也恰好具有location属性。

作为对乔纳森·芬格兰的回答的解释:

  • 同一谓词([position()=1 and @location='US'])中的多个条件必须为真作为一个整体
  • 连续谓词([position()=1][@location='US'])中的多个条件必须为真一个接一个
  • 这意味着[position()=1][@location='US'] != [@location='US'][position()=1]
    while [position()=1 and @location='US'] == [@location='US' and position()=1]
  • . while
  • 提示:单独的[position()=1]可以缩写为[1]

您可以使用布尔运算符“and”和“or”以及布尔XPath函数not()true()false()在谓词中构建复杂的表达式。另外,你还可以把子表达式用圆括号括起来。

/bookstore/book[@location='US'][1]只适用于简单的结构。

再加上一点结构,东西就坏了。

与- - - - - -

<bookstore>
<category>
<book location="US">A1</book>
<book location="FIN">A2</book>
</category>
<category>
<book location="FIN">B1</book>
<book location="US">B2</book>
</category>
</bookstore>

/bookstore/category/book[@location='US'][1]收益率

<book location="US">A1</book>
<book location="US">B2</book>

不是“匹配更复杂条件的第一个节点”。/bookstore/category/book[@location='US'][2]返回什么。

用括号你可以得到原来问题的结果:

(/bookstore/category/book[@location='US'])[1]

<book location="US">A1</book>

(/bookstore/category/book[@location='US'])[2]工作正常。

找到第一个英文book节点的最简单的方法(在整个文档中),考虑到更复杂的结构化xml文件,如:

<bookstore>
<category>
<book location="US">A1</book>
<book location="FIN">A2</book>
</category>
<category>
<book location="FIN">B1</book>
<book location="US">B2</book>
</category>
</bookstore>

是xpath表达式:

/descendant::book[@location='US'][1]

< / b >

    <bookstore>
<book location="US">A1</book>
<category>
<book location="US">B1</book>
<book location="FIN">B2</book>
</category>
<section>
<book location="FIN">C1</book>
<book location="US">C2</book>
</section>
</bookstore>

鉴于上述;您可以选择的第一本书

(//book[@location='US'])[1]

这将会在任何有美国的地方找到第一个。(A1)

//book[@location='US']

将返回包含所有位置为US的图书的节点集。(A1, B1, C2)

(//category/book[@location='US'])[1]

将返回文档中任何类别中存在的第一个图书位置US。(B1)

(/bookstore//book[@location='US'])[1]

返回根元素bookstore下存在的位置为US的第一本书;使/bookstore部分变得多余。(A1)

直接回答:

/bookstore/book[@location='US'][1]

返回book元素的第一个节点,位置为US,位于bookstore [A1]

顺便说一句,如果你想在这个例子中找到第一本不是bookstore直接子书店的美国书:

(/bookstore/*//book[@location='US'])[1]

前女友。

<input b="demo">

(input[@b='demo'])[1]

在在线xpath测试仪的帮助下,我正在写这个答案 : < / p >

<table id="t2"><tbody>
<tr><td>123</td><td>other</td></tr>
<tr><td>foo</td><td>columns</td></tr>
<tr><td>bar</td><td>are</td></tr>
<tr><td>xyz</td><td>ignored</td></tr>
</tbody></table>

下面xpath:

id("t2") / tbody / tr / td[1]

输出:

123
foo
bar
xyz

因为1意味着选择所有< em > td < / em >元素,这些元素是它们自己的直接父元素的第一个子元素 但是下面的xpath:

(id("t2") / tbody / tr / td)[1]

输出:

123

如果xpath很复杂,或者有多个节点使用相同的xpath,则使用索引获取所需的节点。

例:

(//bookstore[@location = 'US'])[index]

你可以给出你想要的节点的编号。

如果在给定的xml上提供了namespace,最好使用这个。

(/*[local-name() ='bookstore']/*[local-name()='book'][@location='US'])[1]