xslt xslt-2.0

xslt - Looping sobre distintos valores



xslt-2.0 (3)

En teoría debería funcionar; ¿Estás seguro de que la XPath dada a la función de distinct-values es correcta? 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.

Dada una variable que devuelve una lista de estados distintos utilizando la función de valores distintivos (), ¿hay alguna forma de convertir la variable en un bucle for-each?

<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 bien.


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

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

Si emite 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:


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>

Devoluciones:

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