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

XPath bookstore/book[1]selectbookstore下的第一本书籍节点。

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

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

这将首先获得位置属性等于“美国”的图书元素。 然后它将从该组中select第一个节点。 请注意使用一些实现所需的括号。

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

/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] yield

 <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]按预期工作。

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

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

您可以使用布尔运算符“ and ”和“ or ”以及布尔型X​​Path函数not()true()false()在谓词中构build复杂expression式。 另外,您可以将子expression式换成圆括号。

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

是xpathexpression式:

 /descendant::book[@location='US'][1] 
  <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> 

所以鉴于以上; 你可以select第一本书

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

这将find第一个任何地方有一个位置美国。 [A1]

 //book[@location='US'] 

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

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

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

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

将会返回位于根元素书店下的任何位置的第一本书; 使/书店部分真正的冗余。 [A1]

直接回答:

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

将返回你书店下的位置美国书籍元素的第一个节点[A1]

顺便说一下,如果你想在这个例子中find第一本不是书店的直接孩子的美国书:

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

在网上xpathtesting者的帮助下,我正在写这个答案…
为了这:

 <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意味着select所有的td元素,这是他们自己的直接父母的第一个孩子。
但是下面的xpath:

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

输出:

 123 

如果xpath比较复杂,或者存在多个xpath相同的节点,则使用该索引获取所需的节点。

例如:(//书店[@location ='US'])[index]

你可以给你想要的节点号码。

例如。

 <input b="demo"> 

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