validaciones - XSLT 1.0-Crear conjunto de nodos y pasar como parámetro
validaciones xsl (2)
Usando XSLT 1.0, intento esencialmente crear un pequeño conjunto de nodos y luego pasarlo como un parámetro a una plantilla, algo como lo siguiente:
<xsl:call-template name="widget">
<xsl:with-param name="flags">
<items>
<item>widget.recent-posts.trim-length=100</item>
<item>widget.recent-posts.how-many=3</item>
<item>widget.recent-posts.show-excerpt</item>
</items>
</xsl:with-param>
</xsl:call-template>
La idea es que desde dentro de la plantilla del widget
podría escribir algo como:
<xsl:value-of select="$flags/item[1]" />
Obviamente recibo errores de compilación ... ¿cómo puedo lograr este tipo de cosas?
Bueno, logré solucionar esto de la siguiente manera:
Primero agregue un espacio de nombre personalizado a su hoja de estilo, por ejemplo, xmlns:myns="http://my.ns.com"
Luego defina el conjunto de nodos en la parte superior de la hoja de estilo:
<myns:recent-posts-flags>
<item>widget.recent-posts.trim-length=100</item>
<item>widget.recent-posts.how-many=3</item>
<item>widget.recent-posts.show-excerpt</item>
</myns:recent-posts-flags>
Luego haz referencia de la siguiente manera:
<xsl:call-template name="widget">
<xsl:with-param name="flags" select="document('''')/*/myns:recent-posts-flags" />
</xsl:call-template>
Esto funciona, pero aún sería ideal para mí definir el conjunto de nodos dentro de la etiqueta <xsl:with-param>
sí, como en el primer ejemplo que di ... ¿Alguien piensa que eso sería posible?
Hay una manera (no estándar) en XSLT 1.0 para crear árboles temporales dinámicamente y evaluar expresiones XPath en ellos, sin embargo , esto requiere el uso de la función xxx:node-set()
.
Siempre que los nodos se crean dinámicamente dentro del cuerpo de una xsl:variable
o xsl:param
, el tipo de esa xsl:variable
/ xsl:param
es RTF (Fragmento de árbol de resultados) y la especificación W3 XSLT 1.0. limita severyly el tipo de expresiones XPath que pueden evaluarse contra un RTF.
Como solución temporal, casi todos los proveedores de XSLT 1.0 tienen su propia función de extensión xxx:node-set()
que toma un RTF y produce un conjunto de nodos normal a partir de él.
El espacio de nombres al que está vinculado el prefijo xxx
(o cualquier otro prefijo que elija) es diferente para diferentes proveedores. Para MSXML y los dos procesadores .NET XSLT es: "urn:schemas-microsoft-com:xslt"
. La biblioteca EXSLT utiliza el espacio de nombres: "http://exslt.org/common"
. Este espacio de nombres EXSLT se implementa en muchos procesadores XSLT 1.0 y, si es posible, se recomienda usar su extensión xxx:node-set()
.
Aquí hay un ejemplo rápido :
<xsl:stylesheet version="1.0"
xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
xmlns:msxsl="urn:schemas-microsoft-com:xslt"
xmlns:ext="http://exslt.org/common"
exclude-result-prefixes="ext msxsl"
>
<xsl:template match="/">
<xsl:variable name="vTempRTF">
<a>
<b/>
</a>
</xsl:variable>
<xsl:copy-of select="ext:node-set($vTempRTF)/a/*"/>
</xsl:template>
</xsl:stylesheet>