2010-07-14 11 views
6

Dada una variable que devuelve una lista de estados distintos que utilizan la función distinct-values ​​(), ¿hay alguna forma de convertir la variable en un bucle for-each?Looping sobre distintos valores

<States> 
<State>AL</State> 
<State>AL</State> 
<State>NM</State> 
</States> 

La siguiente variable devuelve AL y NM, pero no puedo iterar sobre ella utilizando for-each. ¿Hay alguna forma de evitar esto?

<xsl:variable name="FormStates" select="distinct-values(States/State)"/> 
    <xsl:for-each select="$FormStates"> 

XSLT 2.0 ok.

+0

Como siempre, no está claro en absoluto cuál es el problema que tiene. Aprenda a proporcionar: 1. El documento XML de origen. 2. El resultado deseado. 3. Las propiedades requeridas de la transformación. –

+0

He votado para CERRAR esta pregunta. No es realmente una pregunta, no se cuestiona. El problema no está definido y no está claro. –

+0

Lo siento, espero haber aclarado la pregunta. – johkar

Respuesta

5

La función distinct-values() devuelve una secuencia de valores sobre los que debe poder iterar. El resultado es, por así decirlo, "tokenizado".

fn:distinct-values('AL', 'AL', 'NL') devuelve la secuencia ('AL', 'NL').

Si genera la variable con xsl:value-of, devolverá la cadena "AL NL" solo porque el separador de secuencia predeterminado para xsl:value-of es un carácter de espacio único. Esto es algo que podría cambiar con el atributo @separator:

entrada

<?xml version="1.0" encoding="UTF-8"?> 
<States> 
    <State>AL</State> 
    <State>AL</State> 
    <State>NM</State> 
</States> 

XSLT

<?xml version="1.0" encoding="UTF-8"?> 
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="2.0"> 
    <xsl:template match="/"> 
    <xsl:variable name="FormStates" select="distinct-values(States/State)"/> 
    <xsl:comment>xsl:value-of</xsl:comment> 
    <xsl:value-of select="$FormStates" separator=":"/> 
    <xsl:comment>xsl:for-each</xsl:comment> 
    <xsl:for-each select="$FormStates"> 
     <xsl:value-of select="."/> 
     <xsl:text>:</xsl:text> 
    </xsl:for-each> 
    </xsl:template> 
</xsl:stylesheet> 

salida

<?xml version="1.0" encoding="UTF-8"?> 
<!--xsl:value-of--> 
AL:NM 
<!--xsl:for-each--> 
AL:NM: 
+0

Gracias. No estaba al tanto del atributo separador. Terminé construyendo una cadena delimitada y usando tokenize(), pero volveré y lo limpiaré. – johkar

0

En teoría debería funcionar; ¿Estás seguro de que el XPath dado a la función distinct-values es correcto? El código que ha dado requiere que el elemento States sea un hermano del elemento forms.

Puede insertar <xsl:value-of select="count($FormStates)"> inmediatamente después de la declaración de la variable para confirmar si se está configurando correctamente.

2

Aquí hay una solución XSLT 1.0 que he usado en el pasado.

<xsl:template match="/">   
    <ul> 
     <xsl:for-each select="//State[not(.=preceding::*)]"> 
     <li> 
      <xsl:value-of select="."/> 
     </li> 
     </xsl:for-each>    
    </ul> 
    </xsl:template> 

Devuelve:

<ul xmlns="http://www.w3.org/1999/xhtml"> 
    <li>AL</li> 
    <li>NM</li> 
</ul> 
Cuestiones relacionadas