我有以下XML:
<parent>
<pet>
<data>
<birthday/>
</data>
</pet>
<pet>
<data>
<birthday/>
</data>
</pet>
</parent>
现在我想通过parent//birthday[1]
选择第一个生日元素,但这会返回两个生日元素,因为它们都是父母的第一个孩子。
我怎样才能选择整个文档的第一个生日元素,无论它位于何处。我已经尝试了parent//birthday[position()=1]
,但这也无效。
答案 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。
答案 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