Xslt 计数';点击数';各就各位
我有下面的代码。我希望在if sentenses返回true并执行代码块4次后,每个都停止运行。因为我不知道代码块何时执行了4次,所以我不能使用position(),这是我的第一个想法 任何帮助都将不胜感激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
<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') > sc:formatdate(sc:fld('start date',.),'yyyyMMddHHmm')">
<xsl:if test="sc:formatdate($date,'yyyyMMddHHmm') < sc:formatdate(sc:fld('end date',.),'yyyyMMddHHmm')">
<!--EXECUTE A CODE BLOCK-->
</xsl:if>
</xsl:if>
</xsl:for-each>
否因为xslt不是过程语言,所以可以说该语句以并行方式运行,同时获取所有数据,然后显示它。所以它不知道迭代。您不能在xlst()中“退出”for循环。因此,您必须以不同的方式来处理它:
您不能将条件放在select表达式的谓词中,并将使用位置放在for each中,如下所示:
<xsl:for-each select="$itm//item[@template='news item'][sc:formatdate($date,'yyyyMMddHHmm') > sc:formatdate(sc:fld('start date',.),'yyyyMMddHHmm')][sc:formatdate($date,'yyyyMMddHHmm') < sc:formatdate(sc:fld('end date',.),'yyyyMMddHHmm')]">
<xsl:sort select="sc:fld('start date',.)" data-type="text" order="descending"/>
<xsl:if test="position() < 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) < $theDate
and
sc:formatdate(sc:fld('end date', .), $dtFormat) > $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') > sc:formatdate(sc:fld('start date',.),'yyyyMMddHHmm')][sc:formatdate($date,'yyyyMMddHHmm') < sc:formatdate(sc:fld('end date',.),'yyyyMMddHHmm')]">
<xsl:sort select="sc:fld('start date',.)" data-type="text" order="descending"/>
<xsl:if test="position() < 5">
<!-- output something -->
</xsl:if>
</xsl:for-each>