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
”以及布尔型XPath函数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]