2012-04-25 70 views
22

我非常新的XSLT和可能会从错误的角度看我的问题 - 从语言如C++和Java的未来。我希望有人能帮助我。认识第一循环运行在XSLT

我要打个电话回路(的xsl:for-每个)在XSLT和做具体通过循环第一次运行的东西。在其他语言中,我会为此使用状态变量,但是我已经了解到,变量无法在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

回答

36

之外,我认为最简单的方法是检查当前节点的位置。它也比检查树前要素的存在更快(仍然可以工作,如果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> 
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> 

即,如果是第一次,就会有之前什么都没有。然而,也有可能通过其他方式来做到这一点的循环

+0

根据上下文,还有其他一些方法,比如通过创建节点集和遍历它们,计算出你在哪里等等。关键是不要像过程语言那样来思考循环 – Woody 2012-04-25 15:15:33

+0

非常感谢您的快速回答。这解决了它! – Henrik 2012-04-25 15:16:49

+0

@伍迪这是伟大的人!正是我在找什么。 – 2016-08-11 19:54:21

3

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