XSLT和position()

时间:2011-06-18 11:22:39

标签: xml xslt xslt-2.0

我有

<xsl:for-each select="//article[articletype/@id=15 and position() =1]">
什么都没有拉回来。然后我将其改为

<xsl:for-each select="//article[articletype/@id=15]">
<p><xsl:value-of select="position()"/></p>

拉回来

  

1 2 3 4

出现这种情况的原因是什么?我甚至试过number(position())。它只适用于我使用大数而不是我期望的位置

<xsl:for-each select="//article[articletype/@id=15 and position() &lt; 100]">

3 个答案:

答案 0 :(得分:5)

这个问题简化为://article[1]是什么意思?答案是它意味着

/descendant-or-self::node()/child::article[1]

选择文档中每个节点的第一个“article”子节点。这与(//article)[1]不同,<xsl:for-each select="(//article[articletype/@id=15])[1]"> 选择文档中的第一篇文章。

所以你想要的表达是

{{1}}

答案 1 :(得分:0)

使用您列出的第一个XPath://article[articletype/@id=15 and position() =1],您要求每个轴(按文档顺序)中的第一个article元素必须具有articletype/@id=15

对于每个轴,如果第一个article元素没有带articletype的{​​{1}}元素,则没有任何内容匹配。

使用第二个XPath:@id=15,您要求所有//article[articletype/@id=15]元素具有article子元素articletype。显然,你的文档中有4个。

您应该使用以下XPath:

@id=15

Dr. Michael Kay's answer更好地解释了为什么它会这样做。另请参阅this answer from Dimitri Novatchev

答案 2 :(得分:-1)

我认为您需要以下xpath表达式:

<xsl:for-each select="//article[articletype/@id=15][1]">