Xslt 计数';点击数';各就各位

Xslt 计数';点击数';各就各位,xslt,foreach,Xslt,Foreach,我有下面的代码。我希望在if sentenses返回true并执行代码块4次后,每个都停止运行。因为我不知道代码块何时执行了4次,所以我不能使用position(),这是我的第一个想法 任何帮助都将不胜感激 <xsl:for-each select="$itm//item[@template='news item']"> <xsl:sort select="sc:fld('start date',.)" data-type="text" order="descendin

我有下面的代码。我希望在if sentenses返回true并执行代码块4次后,每个都停止运行。因为我不知道代码块何时执行了4次,所以我不能使用position(),这是我的第一个想法

任何帮助都将不胜感激

<xsl:for-each select="$itm//item[@template='news item']">
    <xsl:sort select="sc:fld('start date',.)" data-type="text" order="descending"/>
    <xsl:if test="sc:formatdate($date,'yyyyMMddHHmm') &gt; sc:formatdate(sc:fld('start date',.),'yyyyMMddHHmm')">
        <xsl:if test="sc:formatdate($date,'yyyyMMddHHmm') &lt; sc:formatdate(sc:fld('end date',.),'yyyyMMddHHmm')">
    <!--EXECUTE A CODE BLOCK-->
        </xsl:if>
    </xsl:if>
</xsl:for-each>

否因为xslt不是过程语言,所以可以说该语句以并行方式运行,同时获取所有数据,然后显示它。所以它不知道迭代。

您不能在xlst()中“退出”for循环。因此,您必须以不同的方式来处理它:

  • 更改select语句,以便for each只迭代要执行代码的四项
  • 使用递归(使用call template或apply template以及通过param传递到模板中的参数)。在每个递归中,如果代码块在传递到下一个递归级别之前执行,则可以增加参数。在进入下一个递归级别(即递归函数的退出条件)之前,必须检查参数是否等于4

    
    


  • 您不能将条件放在select表达式的谓词中,并将使用位置放在for each中,如下所示:

    <xsl:for-each select="$itm//item[@template='news item'][sc:formatdate($date,'yyyyMMddHHmm') &gt; sc:formatdate(sc:fld('start date',.),'yyyyMMddHHmm')][sc:formatdate($date,'yyyyMMddHHmm') &lt; sc:formatdate(sc:fld('end date',.),'yyyyMMddHHmm')]">
        <xsl:sort select="sc:fld('start date',.)" data-type="text" order="descending"/>
        <xsl:if test="position() &lt; 5">
          <!-- output something -->
        </xsl:if>
    </xsl:for-each>
    
    
    
    但据我所知,这两个选项都不能让我对xml中的项目进行排序,如果我错了,请纠正我的错误?也许这可以进一步帮助您。虽然,我可以看出这可能会使事情复杂化。因此,我担心没有简单的解决办法。一般来说,可以这样说,如果需要带中断的循环,则必须以某种方式使用递归。您还可以查看您的具体问题,看看是否还有其他问题。
    <!-- convenience variables -->
    <xsl:variable name="dtFormat" select="'yyyyMMddHHmm'" />
    <xsl:variable name="theDate" select="sc:formatdate($date, $dtFormat)" />
    
    <!-- don't loop over nodes testing a condition on each one separately, 
         just select the interesting ones directly -->
    <xsl:variable name="MatchingFields" select="
      $itm//item[@template='news item'][
        sc:formatdate(sc:fld('start date', .), $dtFormat) &lt; $theDate
        and
        sc:formatdate(sc:fld('end date', .), $dtFormat) &gt; $theDate
      ]
    " />
    
    <!-- now do something with the nodes -->
    <xsl:for-each select="$MatchingFields">
      <xsl:sort select="sc:fld('start date',.)" data-type="text" order="descending"/>
      <!--EXECUTE A CODE BLOCK-->
    </xsl:for-each>
    
    <!-- you can also count them (this is your "hit counter") -->
    <xsl:value-of select="count($MatchingFields)" />
    
    <xsl:for-each select="$itm//item[@template='news item'][sc:formatdate($date,'yyyyMMddHHmm') &gt; sc:formatdate(sc:fld('start date',.),'yyyyMMddHHmm')][sc:formatdate($date,'yyyyMMddHHmm') &lt; sc:formatdate(sc:fld('end date',.),'yyyyMMddHHmm')]">
        <xsl:sort select="sc:fld('start date',.)" data-type="text" order="descending"/>
        <xsl:if test="position() &lt; 5">
          <!-- output something -->
        </xsl:if>
    </xsl:for-each>