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

时间:2010-01-29 15:35:41

标签: xpath

我有以下XML:

<parent>
   <pet>
      <data>
         <birthday/>
      </data>
   </pet>
   <pet>
      <data>
         <birthday/>
      </data>
   </pet>
</parent> 

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

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

5 个答案:

答案 0 :(得分:14)

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

(/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>个节点,那些(这是括号所做的,它们创建一个中间节点集),它取第一个 LI>

答案 1 :(得分:4)

仅供参考:您可以使用(免费)XPathVisualizer tool可视化各种Xpath查询的结果。仅适用于Windows。

alt text http://i50.tinypic.com/f8apd.jpg

答案 2 :(得分:1)

好的,我承认这是可怕的,必须有更好的方法,但它似乎有用。

/*/*[descendant::birthday and not(preceding-sibling::*[descendant::birthday])]

我在树的第二层寻找所有元素,这些元素都有一个名为birthday的后代元素,它没有一个以生日元素作为后代的前一个兄弟元素。

答案 3 :(得分:0)

<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet version="2.0"
    xmlns:xsl="http://www.w3.org/1999/XSL/Transform">

    <xsl:template match="/">
        <xsl:variable name="birthdays" select="//birthday"/>
        <xsl:value-of select="$birthdays[1]"/>
    </xsl:template>

</xsl:stylesheet>

答案 4 :(得分:-1)

//birthday[position()=1]
无论层次结构中的位置

//都会找到节点

你也可以

pet[position()=1]/data/birthday