在XPath中仅选择第一个匹配的节点

Ben*_*min 9 xpath

我有以下XML:

<parent>
   <pet>
      <data>
         <birthday/>
      </data>
   </pet>
   <pet>
      <data>
         <birthday/>
      </data>
   </pet>
</parent> 
Run Code Online (Sandbox Code Playgroud)

现在我想选择第一个生日元素,parent//birthday[1]但这会返回两个生日元素,因为它们都是父母的第一个孩子.

我怎样才能选择整个文档的第一个生日元素,无论它位于何处.我已经尝试parent//birthday[position()=1]但是这也不起作用.

Tom*_*lak 15

你的意思是(注意括号!)

(/parent/pet/data/birthday)[1]

或者,更短但不太具体的变化:

(/*/*/*/birthday)[1]
(//birthday)[1]

或者,更多语义,"第一只宠物的生日":

/parent/pet[1]/data/birthday

或者,如果不是所有宠物都有生日条目,则"生日设定的第一只宠物的生日":

/parent/pet[data/birthday][1]/data/birthday

如果从上下文节点工作,则可以通过使表达式相对于该上下文节点来缩写表达式.

说明:

  • /parent/pet/data/birthday[1]<birthday><data>整个文档中选择所有在其各自父节点(节点)中的第一个节点
  • (/parent/pet/data/birthday)[1]选择所有<birthday>节点,以及那些节点(这是括号所做的,它们创建一个中间节点集),它需要第一个节点