Frage

Ich arbeite an einem Umbraco XSL Stylesheet und bin ziemlich festgefahren.

Grundsätzlich habe ich einen Parameter, den ich teste und den Wert verwende, wenn er vorhanden ist. Andernfalls verwende ich den Standardparameter $currentPage.

Hier sind die Parameter

<xsl:param name="source" select="/macro/sourceId" />
<xsl:param name="currentPage" />

Hier ist die 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>

Und hier benutze ich es

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


Kurzgesagt

Das funktioniert

<xsl:variable name="source" select="$currentPage" />

Das nicht

<xsl:variable name="source">
  <xsl:copy-of select="$currentPage" /> <!-- Have tried using <xsl:value-of /> as well -->
</xsl:variable>

Wie kopieren Sie also eine Variable, ohne die zu verwenden? select="" Attribut.

AKTUALISIEREN: Ich habe versucht, einen anderen Ansatz zu verwenden (siehe unten), aber ich bekomme eine Variable aus dem Zielfernrohr Ausnahme.

<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>
War es hilfreich?

Lösung

Im Allgemeinen wählt dieser Ausdruck einen von zwei Knotensets aus, basierend darauf, ob eine bestimmte Bedingung ist true() oder false():

$ns1[$cond] | $ns2[not($cond)]

In Ihrem Fall bedeutet dies:

    umbraco.library:GetXmlNodeById($source) 
|
    $currentPage[not(umbraco.library:GetXmlNodeById($source))]

Das Ganze <xsl:variable> Definition ist:

<xsl:variable name="vCurrent" select=
"        umbraco.library:GetXmlNodeById($source) 
    |
        $currentPage[not(umbraco.library:GetXmlNodeById($source))]
"/>

Dies kann kompakter geschrieben werden:

<xsl:variable name="vRealSource" select="umbraco.library:GetXmlNodeById($source)"/>

<xsl:variable name="vCurrent" select=
    "$vRealSource| $currentPage[not($vRealSource)]"/>

Andere Tipps

Immer wenn Sie eine Variable in XSLT 1.0 ohne @select deklarieren, aber mit einer Inhaltsvorlage ist der variable Typ aus Ergebnisbaumfragment. Die Variable hält den Wurzelknoten dieses Baumfragments.

Also damit:

<xsl:variable name="source"> 
  <xsl:copy-of select="$currentPage" />
</xsl:variable> 

Sie erklären $source als Wurzel eines RTF, der die enthält Kopieren der Knoten (Selbst und Nachkommen) in $currentPage Knotensatz.

Sie können nicht verwenden / Stiefbetreiber mit RTF. Deshalb bist du USSING node-set Erweiterungsfunktion.

Aber, wenn du sagst:

node-set($source)/ancestor-or-self::*

Dies wird zu einem leeren Knotensatz bewertet, da ein Stammknoten nicht ein Element ist.

BEARBEITEN: Wenn Sie zwei Knotensätze haben und eine Variable mit dem Inhalt eines der beiden Knotensätze deklarieren möchten, je nach Bedingung können Sie verwenden:

<xsl:variable name="current" 
              select="umbraco.library:GetXmlNodeById($source)[$source > 0]
                      |$currentPage[0 >= $source]" /> 
Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top