I am having little difficulty in assigning a counter variable and incrementing it and then checking for a certain value in XSLT. Here is my code:
<?xml version="1.0" encoding="utf-8"?>
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform" <xsl:variable name="empty_string"/>
<xsl:variable name="counter" select="0"/>
<xsl:template match="/Collection">
<xsl:for-each select="Content">
<xsl:sort select="Html/root/Event/start_date" order="ascending"/>
<xsl:variable name="isFutureEvent">
<xsl:value-of select="syscom:isFutureDate(Html/root/Event/start_date)" />
</xsl:variable>
<xsl:if test="Html/root/Event != $empty_string">
<xsl:if test="$isFutureEvent='true'">
<!-- Increment Counter -->
<xsl:value-of select="$counter + 1"/>
<!-- Test if Counter < 4 -->
<xsl:if test="$counter < 3">
<div class="media">
<!-- Do stuff here -->
</div>
</xsl:if> <!-- End if for counter -->
</xsl:if>
</xsl:if>
<!--</xsl:when>-->
<!--</xsl:choose>-->
</xsl:for-each>
</xsl:template>
</xsl:stylesheet>
But it doesnt seem to increment my counter and not exiting when the counter hits 3. Any help on this ?
If you want to know where you are in a for-each loop, you can use the built-in position() function.
'Variables' in XSL are actually constants - you cannot change their value. This:
will just output the value of
$counter+1
To do loops you have to use recursion - e.g.:
altough it is better to try to avoid loops - in most cases the XSL can be written to avoid it, but I don't understand enough of what are you trying to achieve to give you the complete solution.
In case any one wants to do this while using .net (
XslCompiledTransform
) you can useThen you add a call to "customCode:AddToCounter()", and then you could write a message like this
<xsl:message><xsl:value-of select="customCode:GetCounter()" /> rows remaining.</xsl:message>
I have same problem. I need increment value in loop. So the simplest way was include Saxon and use that value.
if you use Saxon 6.5.5
if you use Saxon 9.4.0.4
And after that you can simply use saxon variable :
In my case I needed total of boxes in the shipment, this helped
We cant update
xsl:variable
as they are just like constants. But we can updateddp:local-variables
, so heredp:local-variable
counter is initialized before starting for-loop. Each time loop is run counter will update itself by 1. Try This: