2012-09-07 22 views
10

Quiero asignar múltiples variables dependiendo de un entorno de condición. Yo sé cómo hacer eso de una sola variable:XSLT: Establezca múltiples variables usando dependiendo de la condición

<xsl:variable name="foo"> 
    <xsl:choose> 
     <xsl:when test="$someCondition"> 
      <xsl:value-of select="3"/> 
     <xsl:when> 
     <xsl:otherwise> 
      <xsl:value-of select="4711"/> 
     </xsl:otherwise> 
    </xsl:choose> 
</xsl:variable> 

Pero lo que si quiero asignar dos variables en función de la misma condición $ somecondition?

No quiero escribir el mismo xsl: elegir declaración de nuevo, porque es algo extenso y requiere mucha computación en el ejemplo real.

El entorno en cuestión es libxslt (xslt 1.0) con extensiones exslt.

EDIT: Lo que quiero es un comportamiento similar al

if (condition) { 
    foo = 1; 
    bar = "Fred"; 
} 
else if (...) { 
    foo = 12; 
    bar = "ASDD"; 
} 
(... more else ifs...) 
else { 
    foo = ...; 
    bar = "..."; 
} 

Respuesta

11

Lo que podría tener es la variable principal de devolver una lista de elementos; uno para cada variable que desea establecer

<xsl:variable name="all"> 
    <xsl:choose> 
     <xsl:when test="a = 1"> 
      <a> 
       <xsl:value-of select="1"/> 
      </a> 
      <b> 
       <xsl:value-of select="2"/> 
      </b> 
     </xsl:when> 
     <xsl:otherwise> 
      <a> 
       <xsl:value-of select="3"/> 
      </a> 
      <b> 
       <xsl:value-of select="4"/> 
      </b> 
     </xsl:otherwise> 
    </xsl:choose> 
    </xsl:variable> 

Luego, utilizando la función EXSLT, puede convertir a un 'conjunto de nodos', que luego pueden ser utilizados para establecer las variables individuales

<xsl:variable name="a" select="exsl:node-set($all)/a"/> 
    <xsl:variable name="b" select="exsl:node-set($all)/b"/> 

Don Olvídese de que tendrá que declarar el nombre de las funciones exslt en el XSLT para que esto funcione.

+0

eso es un buen uno :-) – Jost

+0

1 Brillante idea! – Fernando

3

Pero, ¿y si quiero asignar dos variables dependiendo de la misma condición $ someCondition?

No quiero escribir el mismo xsl: elegir instrucción nuevamente, porque es algo largo y requiere mucha computación en el ejemplo real.

Suponiendo que los valores de las variables no son ganglios, este código no utiliza ninguna función de extensión para definirlos:

<xsl:variable name=vAllVars> 
    <xsl:choose> 
     <xsl:when test="$someCondition"> 
      <xsl:value-of select="1|Fred"/> 
     <xsl:when> 
     <xsl:when test="$someCondition2"> 
      <xsl:value-of select="12|ASDD"/> 
     <xsl:when> 
     <xsl:otherwise> 
      <xsl:value-of select="4711|PQR" /> 
     </xsl:otherwise> 
    </xsl:choose> 
</xsl:variable> 

<xsl:variable name="foo" select="substring-before($vAllVars, '|')"/> 
<xsl:variable name="bar" select="substring-after($vAllVars, '|')"/> 
+0

Al usar esto, foo y barra siempre tendrían el mismo valor. Eso no es lo que necesito ... Ver mi edición para aclaración. – Jost

+0

@Jost, sí, mira mi actualización. Cuando los valores de las variables no son nodos, es más fácil y probablemente más eficiente no construir (y convertir) un árbol de resultados. –

+0

esta solución debería funcionar. Sin embargo, hay un inconveniente: necesita un separador que nunca puede aparecer en ninguno de los valores variables, que puede ser difícil de encontrar. Y después de elegir uno, este sería un lugar donde las cosas podrían romperse en el futuro cuando cambie otra parte del programa ... – Jost

Cuestiones relacionadas