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 &gt; 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 &gt; 0">
        <xsl:variable name="current" select="umbraco.library:GetXmlNodeById($source)" />
    </xsl:when>
    <xsl:otherwise>
        <xsl:variable name="current" select="$currentPage" />
    </xsl:otherwise>
</xsl:choose>
Foi útil?

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]" /> 
Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top