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

时间:2009-06-17 10:40:27

标签: xpath

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

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

的第一个节点

9 个答案:

答案 0 :(得分:392)

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

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

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

答案 1 :(得分:163)

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

答案 2 :(得分:42)

作为Jonathan Fingland答案的解释:

  • 同一谓词([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”以及布尔XPath函数not()true()和{{}在谓词中构建复杂表达式1}}。另外,您可以将子表达式括在括号中。

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

是xpath表达式:

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

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

所以鉴于上述情况;你可以用

选择第一本书
(//book[@location='US'])[1]

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

//book[@location='US']

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

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

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

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

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

直接回答:

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

将返回书籍元素的第一个节点,其中位置US位于书店[A1]

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

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

答案 5 :(得分:2)

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

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

您可以给出您想要的节点号。

答案 6 :(得分:1)

如果在给定的xml上提供了命名空间,则最好使用它。

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

答案 7 :(得分:0)

代表。

<input b="demo">

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

答案 8 :(得分:-1)

在网上xpath tester的帮助下,我写了这个答案...... 为此:

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

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

输出:

123