Pues no te funciona porque la variable no se comporta como tal.
Se comporta como una constante de valor "si" que es el valor que le pones fuera del bucle.
La variable con el valor "no" esta dentro de un "when" y no sirve para nada.
Yo suelo hacer algo parecido a lo siguiente:
Código:
<style type="text/css">
.Fila1 { background-color: cyan; height: 20px; }
.Fila0 { background-color: yellow; height: 20px; }
</style>
<xsl:for-each select="persona">
<xsl:sort select="apellidos/apellido1" data-type="text" order="ascending"/>
<xsl:variable name="l_fila" select="position() mod 2"/>
<tr class="Fila{$l_fila}">
...
</tr>
</xsl:for-each>