XPath bookstore/book[1]
选择bookstore
下的第一个图书节点。
如何选择匹配更复杂条件的第一个节点,例如匹配/bookstore/book[@location='US']
答案 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