Copiando uma variável xslt
Pergunta
Estou trabalhando em uma folha de estilo Umbraco XSL e estou muito preso.
Basicamente, eu tenho um parâmetro que testo e uso seu valor se estiver presente, caso contrário, uso o parâmetro padrão $currentPage
.
Aqui estão os parâmetros
<xsl:param name="source" select="/macro/sourceId" />
<xsl:param name="currentPage" />
Aqui está a variável
<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>
E é aqui que eu 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>
Em poucas palavras
Isso funciona
<xsl:variable name="source" select="$currentPage" />
Isso não
<xsl:variable name="source">
<xsl:copy-of select="$currentPage" /> <!-- Have tried using <xsl:value-of /> as well -->
</xsl:variable>
Então, como você copia uma variável sem usar o select=""
atributo.
ATUALIZAR: Eu tentei usar outra abordagem (veja abaixo), mas eu recebo um variável fora do escopo exceção.
<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>
Solução
Geralmente, essa expressão seleciona um dos dois modos, com base em se uma determinada condição é true()
ou false()
:
$ns1[$cond] | $ns2[not($cond)]
No seu caso, isso se traduz em:
umbraco.library:GetXmlNodeById($source)
|
$currentPage[not(umbraco.library:GetXmlNodeById($source))]
O completo <xsl:variable>
definição é:
<xsl:variable name="vCurrent" select=
" umbraco.library:GetXmlNodeById($source)
|
$currentPage[not(umbraco.library:GetXmlNodeById($source))]
"/>
Isso pode ser escrito de uma maneira mais compacta:
<xsl:variable name="vRealSource" select="umbraco.library:GetXmlNodeById($source)"/>
<xsl:variable name="vCurrent" select=
"$vRealSource| $currentPage[not($vRealSource)]"/>
Outras dicas
Sempre que você declarar uma variável no XSLT 1.0 sem @select, mas com algum modelo de conteúdo, o tipo de variável será do fragmento de árvore de resultados. A variável mantém o nó raiz deste fragmento de árvore.
Então, com isso:
<xsl:variable name="source">
<xsl:copy-of select="$currentPage" />
</xsl:variable>
Você está declarando $source
como a raiz de um RTF contendo o cópia de dos nós (eu e descendentes) em $currentPage
Conjunto de nós.
Você não pode usar /
Operador de etapa com RTF. É por isso que você está Ussing node-set
Função de extensão.
Mas, quando voce diz:
node-set($source)/ancestor-or-self::*
Isso será avaliado para um conjunto de nós vazios, porque um nó raiz não tem ancestrais e não é um elemento.
EDITAR: Se você tiver dois conjuntos de nós e deseja declarar uma variável com o conteúdo de um dos dois conjuntos de nós, dependendo de alguma condição, você pode usar:
<xsl:variable name="current"
select="umbraco.library:GetXmlNodeById($source)[$source > 0]
|$currentPage[0 >= $source]" />