27

我对 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>

非常感谢!亨里克

4

3 回答 3

44

我认为最简单的方法是检查当前节点的位置。它也比检查树中是否存在前面的元素更快(如果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>
于 2012-04-25T15:31:49.227 回答
3

尽量避免想到“时间”。没有第一次,因为 XSLT 执行没有及时排序。但是输入序列中有第一项,您可以通过测试 position()=1 来判断何时处理序列中的第一项。

于 2012-04-25T17:42:40.707 回答
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>

即,如果它是第一个,那么在它之前就什么都没有。但是,可能还有其他方法可以在循环之外执行此操作

于 2012-04-25T15:03:25.887 回答