¿Cómo incrementar una variable dentro de una plantilla XSLT?

aquí está brevemente el problema al que me enfrento:

He creado un elemento web de consulta de contenido personalizado, lleno este CQWP con elementos de una lista. Lo que me gustaría hacer es tener un separador especial cada 3 elementos.

¿Cómo decirle al XSLT que el ítem actual es el 3, 6 o 9, y por lo tanto, que hay que poner un separador?

lo que he pensado sería hacer algo así en el itemstyle.xsl:

<xsl:variable name="increment" select="0"/>
<xsl:template>
<xsl:with-variable name="increment" select="$increment+1"/>
<xsl:if increment = multiple de 3>
-put a separator-
</xsl:if>
</xsl:template>

pero parece que la variable global no se puede utilizar de esta forma. Por lo tanto, mi segunda idea sería obtener una especie de "número de fila" del elemento correspondiente para obtener la misma información.

¿Alguien tiene alguna idea de cómo puedo resolver este problema?

preguntado el 27 de agosto de 11 a las 15:08

Proporcione la entrada de muestra y la salida deseada. -

El problema (además del hecho de que en ningún lenguaje funcional las variables no se pueden incrementar), es que no ha mostrado el documento XML fuente ni el resultado deseado. En este caso, nada puede producir ningún resultado de ningún documento XML. -

1 Respuestas

XSLT no realiza actualizaciones destructivas. Por lo tanto, no puede asignar un valor a una variable y luego sobrescribir la variable con un nuevo valor más tarde.

En su caso, puede usar la función position () con aritmética de módulo:

<xsl:for-each select="*">
  <!-- normal processing here -->
  <xsl:if test="position() mod 3 = 0">
    <!-- separator here -->
  </xsl:if>
</xsl:for-each>

Respondido 27 ago 11, 19:08

Ya lo probé sin éxito: position () siempre se establece en 1 sin importar qué elemento esté actualmente en el bucle - Holden

Si nos mostró su código, podríamos decirle dónde está mal. ¡No te asustes ni te avergüences! Es parte de la disciplina profesional de un buen programador invitar a la crítica a su trabajo y aprender de él. Esa es la única forma en que mejorará. - Michael Kay

@Holden: tenga en cuenta que utilizo un <xsl:foreach> elemento para iterar sobre el conjunto de nodos. (Tenga en cuenta que puede utilizar expresiones de predicado en el match atributos de su plantilla, también.) Pero el quid es que position() depende de la posición del corriente elemento dentro del actualmente seleccionado conjunto de nodos: en mi ejemplo, todos los elementos secundarios. Entonces, si tiene un flujo de control donde su conjunto de nodos termina con un solo elemento, la posición de este elemento dentro de ese conjunto de nodos siempre será 1. - user268396

gracias, resolví parcialmente mi problema. De hecho, estaba manipulando itemstyle.xsl en lugar de contentquerymain.xsl. - Holden

No es la respuesta que estás buscando? Examinar otras preguntas etiquetadas or haz tu propia pregunta.