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 ”以及布尔型X​​Path函数not()true()false()在谓词中构建复杂表达式。 另外你可以用子括号包装子表达式。

    链接地址: http://www.djcxy.com/p/56993.html

    上一篇: XPath: Select first element with a specific attribute

    下一篇: Why doesn't JavaScript support multithreading?