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

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 &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>
¿Fue útil?

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]" /> 
Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top