2012-04-25 21 views
22

Soy bastante nuevo en XSLT y podría estar mirando mi problema desde el ángulo equivocado, proveniente de lenguajes como C++ y Java. Espero que alguien me pueda ayudar.Reconocer el primer bucle ejecutado en XSLT

Quiero hacer una llamada de bucle (xsl: for-each) en XSLT y hacer algo específico en la primera ejecución a través del bucle. En otros idiomas, utilizaría una variable de estado para esto, pero las variables no pueden cambiar su valor en XSLT como he aprendido, entonces, ¿cómo puedo resolver este problema? Esto es lo que quiero hacer. La parte superior de la cláusula if es, por supuesto, falsa y representa mi problema.

<xsl:for-each select="browser/value"> 
<xsl:if test="FIRST TIME IN LOOP"> 
    do something once 
</xsl:if> 

<xsl:value-of select="current()" /> 
</xsl:for-each> 

Gracias alot! Henrik

Respuesta

36

Creo que la manera más fácil es verificar la posición del nodo actual. También es más rápido que la comprobación de la existencia de precedentes valor elementos en el árbol (y todavía funcionará si se añade a la xsl:sort circular):

<xsl:for-each select="browser/value"> 
    <xsl:if test="position()=1"> 
    do something here 
    </xsl:if> 
    <xsl:value-of select="blah"/> 
</xsl:for-each> 
2

Así es como lo haces, tienes que dejar de pensar como un procedimiento y empezar a pensar de forma más recursiva.

(modificado)

<xsl:for-each select="browser/value"> 
     <xsl:if test="not(preceding::value[parent::browser])"> 
       first post! 
     </xsl:if> 
     <xsl:value-of select="blah"/> 
    </xsl:for-each> 

es decir, si es la primera, no habrá nada antes de ella. Sin embargo, puede haber otras formas de hacerlo fuera del ciclo

+0

Existen otras maneras, dependiendo del contexto, como crear conjuntos de nodos y iterar a través de ellos, calcular el recuento de dónde se encuentra, etc. La clave es no pensar en el ciclo de la misma manera que en un lenguaje de procedimientos – Woody

+0

Muchas gracias por la respuesta rápida. ¡Eso lo resolvió! – Henrik

+0

@Woody ¡Este es un gran hombre! Exactamente lo que estaba buscando. –

3

Trate de evitar el pensamiento de "tiempo". No es la primera vez, porque la ejecución XSLT no está ordenada a tiempo. Pero hay un primer elemento en la secuencia de entrada, y usted puede saber cuándo está procesando el primer elemento de la secuencia probando la posición() = 1.

Cuestiones relacionadas