La copia de una variable XSLT
Pregunta
Estoy trabajando en una Umbraco hoja de estilo XSL y estoy bastante atascado.
Básicamente, tengo un parámetro que puedo probar y usar este valor si se encuentra presente, de lo contrario, utilice el parámetro predeterminado $currentPage
.
Aquí están los parámetros
<xsl:param name="source" select="/macro/sourceId" />
<xsl:param name="currentPage" />
Aquí está la variable
<xsl:variable name="current">
<xsl:choose>
<xsl:when test="$source > 0">
<xsl:copy-of select="umbraco.library:GetXmlNodeById($source)" />
</xsl:when>
<xsl:otherwise>
<xsl:copy-of select="$currentPage" />
</xsl:otherwise>
</xsl:choose>
</xsl:variable>
Y aquí es donde yo lo uso
<xsl:for-each select="msxml:node-set($source)/ancestor-or-self::* [@isDoc and @level=$level]/* [@isDoc and string(umbracoNaviHide) != '1']">
... code here ...
</xsl:for-each>
En una cáscara de nuez
Esto funciona
<xsl:variable name="source" select="$currentPage" />
Esto no
<xsl:variable name="source">
<xsl:copy-of select="$currentPage" /> <!-- Have tried using <xsl:value-of /> as well -->
</xsl:variable>
Entonces, ¿cómo copiar una variable sin necesidad de utilizar el select=""
atributo.
ACTUALIZACIÓN: He intentado usar otro enfoque (ver abajo), pero tengo un variable fuera del alcance excepción.
<xsl:choose>
<xsl:when test="$source > 0">
<xsl:variable name="current" select="umbraco.library:GetXmlNodeById($source)" />
</xsl:when>
<xsl:otherwise>
<xsl:variable name="current" select="$currentPage" />
</xsl:otherwise>
</xsl:choose>
Solución
En general, esta expresión selecciona uno de los dos nodesets, en función de si una condición dada es true()
o false()
:
$ns1[$cond] | $ns2[not($cond)]
En tu caso esto se traduce en:
umbraco.library:GetXmlNodeById($source)
|
$currentPage[not(umbraco.library:GetXmlNodeById($source))]
El completo <xsl:variable>
La definición es:
<xsl:variable name="vCurrent" select=
" umbraco.library:GetXmlNodeById($source)
|
$currentPage[not(umbraco.library:GetXmlNodeById($source))]
"/>
Esto se puede escribir de una manera más compacta:
<xsl:variable name="vRealSource" select="umbraco.library:GetXmlNodeById($source)"/>
<xsl:variable name="vCurrent" select=
"$vRealSource| $currentPage[not($vRealSource)]"/>
Otros consejos
Cuando se declara una variable en XSLT 1.0 sin @select, pero con algún contenido de la plantilla, el tipo de variable será de Árbol de resultados Fragmento.La variable contiene el nodo raíz de este árbol fragmento.
Así que, con esto:
<xsl:variable name="source">
<xsl:copy-of select="$currentPage" />
</xsl:variable>
Usted está declarando $source
como la raíz de una RTF que contiene el copia de los nodos (auto y descendientes) en $currentPage
conjunto de nodos.
No se puede usar /
paso operador con formato RTF.Es por eso que ussing node-set
función de extensión.
Pero, cuando usted dice:
node-set($source)/ancestor-or-self::*
Este será evaluar a un vacío de conjunto de nodos, debido a que un nodo raíz no ha antepasados un no es un elemento.
EDITAR:Si usted tiene dos nodos de conjuntos, y desea declarar una variable con el contenido de uno de los dos nodos de conjuntos dependiendo de alguna condición, usted podría usar:
<xsl:variable name="current"
select="umbraco.library:GetXmlNodeById($source)[$source > 0]
|$currentPage[0 >= $source]" />