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 &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>

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 &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>
È stato utile?

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]" /> 
Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top