Saltar al contenido

XSL: ¿Cuál es la mejor manera de almacenar un nodo en una variable y luego usarlo en futuras expresiones xpath?

Solución:

Prueba este ejemplo:

<xsl:variable name="hotels" select="/results/hotels[active="true"]" />
<xsl:variable name="three_star_or_less"
              select="$hotels[number(rating) &lt;= 3]" />
<xsl:for-each select="$three_star_or_less">
    <xsl:sort select="rating" />
    <xsl:value-of select="rating" />
</xsl:for-each>

No hay ningún problema para almacenar un conjunto de nodos en una variable en XSLT 1.0 y no se necesitan extensiones. Si solo usa una expresión XPath en select atributo de xsl:variable, terminarás haciendo precisamente eso.

El problema es solo cuando desea almacenar los nodos que tú mismo habías generado en una variable, e incluso entonces solo si desea consultarlos más tarde. El problema aquí es que los nodos que genera no tienen el tipo “conjunto de nodos”; en cambio, son lo que se llama un “fragmento de árbol de resultados”. Puede almacenar eso en una variable y puede usar esa variable para insertar el fragmento en la salida (u otra variable) más adelante, pero no puede usar XPath para consultarlo. Ahí es cuando necesitas EXSLT node-set() función (que convierte un fragmento de árbol de resultados en un conjunto de nodos), o XSLT 2.0 (en el que no hay fragmentos de árbol de resultados, solo secuencias de nodos, independientemente de su procedencia).

Para su ejemplo dado, esto no parece ser un problema. La respuesta de Rubens da la sintaxis exacta.

Otra nota, si desea poder usar la variable como parte de una declaración XPath, debe seleccionar la variable con <xsl:copy-of select="."/> en lugar de <xsl:value-of select="."/>

value-of solo tomará el texto del nodo y no podrá usar la función de conjunto de nodos para devolver algo significativo.

<xsl:variable name="myStringVar">
   <xsl:value-of select="."/>
</xsl:variable>

<!-- This won't work: -->
<Output>
   <xsl:value-of select="node-set($myStringVar)/SubNode" />
</Output>


<xsl:variable name="myNodeSetVar">
   <xsl:copy-of select="."/>
</xsl:variable>

<!-- This will work: -->
<Output>
   <xsl:value-of select="node-set($myNodeSetVar)/SubNode" />
</Output>
¡Haz clic para puntuar esta entrada!
(Votos: 0 Promedio: 0)


Tags : / /

Utiliza Nuestro Buscador

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *