XPath:选择具有特定属性的第一个元素

rip*_*234 278 xpath

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

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

Jon*_*and 408

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

这将首先获得location属性等于'US'的book元素.然后它将从该集合中选择第一个节点.请注意某些实现所需的括号的使用.

(请注意,/bookstore/book[1][@location='US']除非第一个元素恰好具有该位置属性,否则不一样)

  • 这将获得"美国"的所有书籍.(/ bookstore/book [@ location ='US'])[1]将获得第一个. (7认同)
  • @KevinDriedger`/ bookstore/book [@ location ='US'] [1]`不返回"美国"的所有书籍.我已经在不同语言的xpath实现下多次测试了它.`/ bookstore/book [@ location ='US'] [1]`返回书店下的第一本"美国"书.如果有多个书店,那么它将从每个书店返回第一个.这就是OP所要求的(书店下的第一个节点).您的版本只返回所有书店的一本书(第一场比赛). (3认同)
  • @JonathanFingland你误解了 - 再次阅读KevinDriedger的回答,以及AlexanderV.Ilyin的问题.你们两个都意味着同样的事情. (2认同)

小智 167

/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> 
Run Code Online (Sandbox Code Playgroud)

/bookstore/category/book[@location='US'][1] 产量

<book location="US">A1</book>
<book location="US">B2</book>
Run Code Online (Sandbox Code Playgroud)

不是"匹配更复杂条件的第一个节点"./bookstore/category/book[@location='US'][2]没有回报.

使用括号,您可以获得原始问题的结果:

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

<book location="US">A1</book>
Run Code Online (Sandbox Code Playgroud)

并按(/bookstore/category/book[@location='US'])[2]预期工作.

  • 这里接受的答案的作者.OP的问题是`/ bookstore/book [1]`而不是`(/ bookstore/book)[1]`.您提供的案例与OP要求的案例不同.据推测,OP接受了我的回答,因为它完成了他所期望的(并要求). (11认同)
  • 括号工作!您还可以在(..)[1]之后添加更多路径,例如:`'(// div [text()="'+ name +'"])[1]/following-sibling ::*/div /文本()''.如果有许多节点匹配`name`. (2认同)
  • 我正在改变我的看法。经过一段距离后,我明白了这个答案的意思,如果我没有看到 OP 的例子,我会投赞成票。我想我是对这个答案的语气做出反应;如果@tkurki 解释了更多关于将条件与第一个节点的选择分离的内容,我会立即看到它。JonFingland 或许也是如此。 (2认同)

Tom*_*lak 47

作为Jonathan Fingland答案的解释:

  • 同一谓词([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]
  • 提示:单独[position()=1]可以缩写为[1]

你可以建立在谓词复杂的表达式与布尔运算符" and"和" or",并与布尔XPath函数not(),true()false().另外,您可以将子表达式括在括号中.


Gee*_*Bee 12

查找第一个英文书籍节点(在整个文档中)的最简单方法,考虑更复杂的结构化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> 
Run Code Online (Sandbox Code Playgroud)

是xpath表达式:

/descendant::book[@location='US'][1]
Run Code Online (Sandbox Code Playgroud)


iZi*_*ian 8

    <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> 
Run Code Online (Sandbox Code Playgroud)

因此,鉴于上述情况;您可以选择第一本书

(//book[@location='US'])[1]
Run Code Online (Sandbox Code Playgroud)

这将在第一个有美国位置的地方找到第一个。[A1]

//book[@location='US']
Run Code Online (Sandbox Code Playgroud)

将返回所有位置为US的书籍的节点集。[A1,B1,C2]

(//category/book[@location='US'])[1]
Run Code Online (Sandbox Code Playgroud)

将返回文档中任何位置的类别中存在的第一本书位置US。[B1]

(/bookstore//book[@location='US'])[1]
Run Code Online (Sandbox Code Playgroud)

将返回根元素书店下任何位置的位置为US的第一本书;使得/ bookstore部分确实多余。[A1]

直接回答:

/bookstore/book[@location='US'][1]
Run Code Online (Sandbox Code Playgroud)

将为您返回书店[A1]下位置为US的书元素的第一个节点

顺便说一句,如果您想在此示例中查找第一本不是书店直接子书的美国图书:

(/bookstore/*//book[@location='US'])[1]
Run Code Online (Sandbox Code Playgroud)


小智 5

如果 xpath 很复杂或存在多个具有相同 xpath 的节点,请使用索引来获取所需的节点。

前任 :

(//bookstore[@location = 'US'])[index]
Run Code Online (Sandbox Code Playgroud)

您可以给出所需节点的编号。