XPath:选择具有特定属性的第一个元素
XPath bookstore/book[1]
选择bookstore
下的第一本书籍节点。
我如何选择匹配更复杂条件的第一个节点,例如与/bookstore/book[@location='US']
匹配的第一个节点/bookstore/book[@location='US']
使用(/bookstore/book[@location='US'])[1]
这将首先获取位置属性等于'US'的图书元素。 然后它将从该组中选择第一个节点。 请注意使用括号,这是一些实现所需的。
(注意这不同于/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]
while
[position()=1 and @location='US']
== [@location='US' and position()=1]
[position()=1]
可以缩写为[1]
您可以使用布尔运算符“ and
”和“ or
”以及布尔型XPath函数not()
, true()
和false()
在谓词中构建复杂表达式。 另外你可以用子括号包装子表达式。