Copia di una variabile XSLT
Domanda
Sto lavorando su un foglio di stile Umbraco XSL e sono piuttosto bloccato.
Fondamentalmente, ho un parametro che test e uso il suo valore se è presente, altrimenti uso il parametro predefinito $currentPage
.
Ecco i parametri
<xsl:param name="source" select="/macro/sourceId" />
<xsl:param name="currentPage" />
Ecco la variabile
<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>
Ed ecco dove 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>
In poche parole
Questo funziona
<xsl:variable name="source" select="$currentPage" />
Questo non lo fa
<xsl:variable name="source">
<xsl:copy-of select="$currentPage" /> <!-- Have tried using <xsl:value-of /> as well -->
</xsl:variable>
Quindi, come si copia una variabile senza usare il select=""
attributo.
AGGIORNARE: Ho provato a usare un altro approccio (vedi sotto) ma ottengo un variabile per portata eccezione.
<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>
Soluzione
Generalmente, questa espressione seleziona uno dei due nodi, in base al fatto che una determinata condizione sia true()
o false()
:
$ns1[$cond] | $ns2[not($cond)]
Nel tuo caso questo si traduce in:
umbraco.library:GetXmlNodeById($source)
|
$currentPage[not(umbraco.library:GetXmlNodeById($source))]
Il completo <xsl:variable>
la definizione è:
<xsl:variable name="vCurrent" select=
" umbraco.library:GetXmlNodeById($source)
|
$currentPage[not(umbraco.library:GetXmlNodeById($source))]
"/>
Questo può essere scritto in un modo più compatto:
<xsl:variable name="vRealSource" select="umbraco.library:GetXmlNodeById($source)"/>
<xsl:variable name="vCurrent" select=
"$vRealSource| $currentPage[not($vRealSource)]"/>
Altri suggerimenti
Ogni volta che si dichiara una variabile in XSLT 1.0 senza @select, ma con alcuni modelli di contenuto, il tipo di variabile sarà del frammento di alberi di risultato. La variabile contiene il nodo radice di questo frammento di albero.
Quindi, con questo:
<xsl:variable name="source">
<xsl:copy-of select="$currentPage" />
</xsl:variable>
Stai dichiarando $source
come la radice di un RTF contenente il copia dei nodi (sé e discendenti) in $currentPage
set di nodi.
Non puoi usare /
STEP OPERATOR con RTF. Ecco perché stai usando node-set
funzione di estensione.
Ma, quando dici:
node-set($source)/ancestor-or-self::*
Questo verrà valutato in un set di nodi vuoti, perché un nodo radice non ha antenati e non è un elemento.
MODIFICARE: Se si dispone di due set di nodi e si desidera dichiarare una variabile con il contenuto di uno dei due set di nodi a seconda di alcune condizioni, è possibile utilizzare:
<xsl:variable name="current"
select="umbraco.library:GetXmlNodeById($source)[$source > 0]
|$currentPage[0 >= $source]" />