识别XSLT中的第一个循环运行

28

我对XSLT很陌生,可能从C++和Java等语言的角度看我的问题会有所偏颇。希望有人能帮助我。

我想在XSLT中进行一个循环调用(xsl:for-each),并在第一次遍历时执行特定操作。在其他语言中,我会使用状态变量来实现这一点,但由于我已经了解到变量在XSLT中无法更改其值,所以我该如何解决这个问题?以下是我的需求,if语句中的大写部分当然是伪代码,代表我的问题。

<xsl:for-each select="browser/value">
 <xsl:if test="FIRST TIME IN LOOP">
  do something once
 </xsl:if>

 <xsl:value-of select="current()" />
</xsl:for-each>

非常感谢! Henrik

3个回答

48

我认为最简单的方法是检查当前节点的位置。这也比在树中检查前面的value元素的存在要快(并且如果在循环中添加了xsl:sort,它仍将起作用):

<xsl:for-each select="browser/value">
  <xsl:if test="position()=1">
    do something here
  </xsl:if>
  <xsl:value-of select="blah"/>
</xsl:for-each>

3

在处理XSLT时,尽量避免考虑“时间”这一概念。因为XSLT的执行并不按时间顺序进行。但是,在输入序列中存在第一个项目,您可以通过测试position()=1来确定处理序列中的第一个项目。


2
这不是正确的方法 - 你需要停止以过程为思考方式,开始更多地递归思考。
  <xsl:for-each select="browser/value">
      <xsl:if test="not(preceding::value[parent::browser])">
                first post!
      </xsl:if>
      <xsl:value-of select="blah"/>
  </xsl:for-each>

如果它是第一个,那么它前面就没有什么东西了。但是,在循环之外可能有其他方法来完成这个任务。


根据上下文,还有其他的方法,比如创建节点集并遍历它们,计算您所在位置的数量等。关键是不要像处理过程式语言一样思考循环。 - Woody

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接