首页 文章

XPath:选择具有特定属性的第一个元素

提问于
浏览
251

XPath bookstore/book[1] 选择 bookstore 下的第一个书籍节点 .

如何选择匹配更复杂条件的第一个节点,例如与 /bookstore/book[@location='US'] 匹配的第一个节点

8 回答

  • 369

    对于前

    <input b="demo">
    

    (input[@b='demo'])[1]
    
  • 11

    借助在线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
    
  • 41

    如果xpath很复杂或者多个节点存在相同的xpath,请使用索引获取所需的节点 .

    例如:(//书店[@location ='US'])[索引]

    您可以给出您想要的节点号 .

  • 3

    /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>
    

    不是"the first node that matches a more complicated condition" . /bookstore/category/book[@location='US'][2] 什么都不返回 .

    使用括号,您可以获得原始问题的结果:

    (/bookstore/category/book[@location='US'])[1] 给出

    <book location="US">A1</book>
    

    (/bookstore/category/book[@location='US'])[2] 按预期工作 .

  • 0

    使用 (/bookstore/book[@location='US'])[1]

    这将首先获得location属性等于'US'的book元素 . 然后它将从该集合中选择第一个节点 . 请注意某些实现所需的括号的使用 .

    (注意这与 /bookstore/book[1][@location='US'] 不同,除非第一个元素也恰好具有该location属性)

  • 0

    查找第一个英文书籍节点(在整个文档中)的最简单方法,考虑更复杂的结构化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]


  • 154
    <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]
    
  • 2

    作为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 " and " or ”以及布尔XPath函数 not()true()false() 在谓词中构建复杂表达式 . 另外,您可以将子表达式括在括号中 .

相关问题