2009-05-22 38 views
10

Mi requisito es -usando XSLT- mostrar una lista desplegable con los estados de EE. UU. Y imprimir 'seleccionado' en un específico que está declarado en el XML que usará mi hoja de estilos.¿Cómo declarar e iterar una matriz en XSLT?

Estaba pensando en declarar una matriz con los estados y repetirla, pero no sé cómo hacerlo.

NOTA: Más ideas son bienvenidas;)

Respuesta

12

Una forma de hacer esto es integrar los datos de estado en la hoja de estilo sí, y acceder a los documentos de estilos usando document(''), de la siguiente manera:

<xsl:stylesheet version="1.0" 
    xmlns:xsl="http://www.w3.org/1999/XSL/Transform" 
    xmlns:my="whatever" 
    exclude-result-prefixes="my"> 

    <xsl:output indent="yes"/> 

    <!-- The value of the state you want to select, supplied in the input XML --> 
    <xsl:variable name="selected-state" select="/xpath/to/state/value"/> 

    <!-- You have to use a namespace, or the XSLT processor will complain --> 
    <my:states> 
    <option>Alabama</option> 
    <option>Alaska</option> 
    <!-- ... --> 
    <option>Wisconsin</option> 
    <option>Wyoming</option> 
    </my:states> 

    <xsl:template match="/"> 
    <!-- rest of HTML --> 
    <select name="state"> 
     <!-- Access the embedded document as an internal "config" file --> 
     <xsl:apply-templates select="document('')/*/my:states/option"/> 
    </select> 
    <!-- rest of HTML --> 
    </xsl:template> 

      <!-- Copy each option --> 
      <xsl:template match="option"> 
      <xsl:copy> 
       <!-- Add selected="selected" if this is the one --> 
       <xsl:if test=". = $selected-state"> 
       <xsl:attribute name="selected">selected</xsl:attribute> 
       </xsl:if> 
       <xsl:value-of select="."/> 
      </xsl:copy> 
      </xsl:template> 

</xsl:stylesheet> 

que me haga saber si tiene alguna pregunta.

+1

¿No sería posible también poner el nodo my: states dentro de una declaración de variable y usar esta variable en la expresión de selección? –

+1

En XSLT 2.0, sí. En XSLT 1.0, necesitaría usar una función de extensión, como exsl: node-set() o msxsl: node-set(). La solución del documento ('') no requiere ninguna de las dos cosas. –

1

Lo ideal sería almacenar la lista de estados en el archivo XML y XSLT sólo tiene que utilizar para iterar a ellos.

Actualización: Si no puede editar el XML, se puede buscar en el uso del document function para cargar datos de un segundo archivo de datos:

+0

No puedo cambiar el XML, es proporcionado por otro sistema –

+0

Aún puede acceder a otro documento XML estático que contiene la lista de estados utilizando la función de documento, ¿verdad? – Elijah

Cuestiones relacionadas