xslt - transformar - xsl basico
XSL: ¿Cuál es la mejor forma de almacenar un nodo en una variable y luego usarlo en futuras expresiones xpath? (3)
No hay problemas para almacenar un conjunto de nodos en una variable en XSLT 1.0, y no se necesitan extensiones. Si solo usas una expresión XPath en el atributo select
de xsl:variable
, terminarás haciendo eso.
El problema es solo cuando desea almacenar los nodos que usted mismo ha generado en una variable, e incluso entonces solo si desea consultar sobre ellos más adelante. El problema aquí es que los nodos que genera no tienen el tipo "conjunto de nodos"; en cambio, son lo que se denomina "fragmento de árbol de resultados". Puede almacenarlo 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 consultar sobre ella. Ahí es cuando necesita la función EXSLT node-set()
(que convierte un fragmento del árbol de resultados en un conjunto de nodos), o XSLT 2.0 (en la que no hay fragmentos de árboles de resultados, solo secuencias de nodos, independientemente de su origen) ).
Para su ejemplo dado, esto no parece ser un problema. La respuesta de Rubens da la sintaxis exacta.
Necesito poder almacenar un conjunto de nodos en la variable y luego realizar más archivado / clasificación en él luego. Todos los ejemplos que he visto de esto involucran el uso de XSL2 o las extensiones, ninguna de las cuales es realmente una opción.
Tengo una lista de hoteles en mi documento XML que se pueden ordenar / filtrar y luego paginar a través de 5 a la vez. A pesar de que estoy repitiendo un montón de lógica, actualmente no he encontrado una buena manera de almacenar los conjuntos de nodos en la variable xsl y luego usar xpath en ellos para seguir filtrando / ordenando.
Este es el tipo de cosa que busco (disculpe el código escrito en la parte superior de mi cabeza, por lo que podría no ser 100%):
<xsl:variable name="hotels" select="/results/hotels[active=''true'']" />
<xsl:variable name="3_star_or_less" select="/results/hotels[number(rating) <= 3]" />
<xsl:for-each select="3_star_or_less">
<xsl:sort select="rating" />
</xsl:for-each>
¿Alguien tiene un ejemplo de la mejor manera de hacer este tipo de cosas?
Otra nota, si desea poder usar la variable como parte de una declaración XPath, debe seleccionar la variable con <xsl:copy-of select="."/>
lugar de <xsl:value-of select="."/>
value-of solo tomará el texto del nodo y no podrá utilizar la función de configuración de nodo para devolver nada 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>
Prueba este ejemplo:
<xsl:variable name="hotels" select="/results/hotels[active=''true'']" />
<xsl:variable name="three_star_or_less"
select="$hotels[number(rating) <= 3]" />
<xsl:for-each select="$three_star_or_less">
<xsl:sort select="rating" />
<xsl:value-of select="rating" />
</xsl:for-each>