bookstore/book[1]
选择了bookstore
下的第一个book
节点。如何选择符合更复杂条件的第一个节点,例如符合
/bookstore/book[@location='US']
的第一个节点?bookstore/book[1]
选择了bookstore
下的第一个book
节点。/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]
返回
<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]
按预期工作。
/bookstore/book[1]
而不是(/bookstore/book)[1]
。你提供的情况与OP所问的不同。可以推测,OP接受了我的答案,因为它达到了他的期望(并且请求)。 - Jonathan Fingland'(//div[text() = "'+ name +'"])[1]/following-sibling::*/div/text()'
。如果有许多节点与“name”匹配。 - Hlung对于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()
和 false()
在谓词中构建复杂表达式。此外,您还可以将子表达式放在括号中。
=
运算符可以解决问题:[position() = (1,3,5,6,7,9)]
。 - Tomalak在考虑更复杂的结构化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>
/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>
因此,基于上述情况,您可以选择第一本书。
(//book[@location='US'])[1]
这将找到任何具有 US 位置的第一个。[A1]
//book[@location='US']
会返回所有位置为US的图书节点集。[A1,B1,C2]
(//category/book[@location='US'])[1]
将返回文档中任何位置存在的第一个属于类别US的书籍位置。[B1]
(/bookstore//book[@location='US'])[1]
将返回根元素 bookstore 下任何存在的第一本位置为 US 的书籍;实际上 /bookstore 部分是多余的。[A1]
直接回答:
/bookstore/book[@location='US'][1]
将返回位于书店[A1]下的位置为“US”的第一个书籍元素节点
顺带一提,在此示例中,如果您想找到不是书店直接子级的第一个美国书籍:
(/bookstore/*//book[@location='US'])[1]
(//bookstore[@location = 'US'])[index]
(/*[local-name() ='bookstore']/*[local-name()='book'][@location='US'])[1]
借助在线xpath测试工具,我写下了这个答案...
为此:
<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
例如。
<input b="demo">
而且
(input[@b='demo'])[1]
/bookstore/book[@location='US'][1]
并不能返回所有来自'US'的书籍。我已经在不同语言的xpath实现下进行了多次测试。/bookstore/book[@location='US'][1]
只会返回一个书店中第一本'US'书籍。如果有多个书店,则从每个书店返回第一个。这正是原帖所要求的(在书店下的第一个节点)。你的版本只会从所有书店中返回一本书(第一个匹配的结果)。 - Jonathan Fingland