Копирование переменной XSLT
Вопрос
Я работаю над umbraco XSL stylesheet, и я довольно застрял.
По сути, у меня есть параметр, который я проверю, и использую его значение, если он присутствует, в противном случае я использую параметр по умолчанию $currentPage
.
Вот параметры
<xsl:param name="source" select="/macro/sourceId" />
<xsl:param name="currentPage" />
Вот переменная
<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>
И вот где я его пользуюсь
<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>
В двух словах
Это работает
<xsl:variable name="source" select="$currentPage" />
Это не
<xsl:variable name="source">
<xsl:copy-of select="$currentPage" /> <!-- Have tried using <xsl:value-of /> as well -->
</xsl:variable>
Так как вы копируете переменную без использования select=""
атрибут.
ОБНОВИТЬ: Я пытался использовать другой подход (см. Ниже), но я получаю переменная не имеет возможности исключение.
<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>
Решение
Как правило, это выражение выбирает один из двух узлов, основанных на том, является ли данное условие true()
или false()
:
$ns1[$cond] | $ns2[not($cond)]
В вашем случае это переводится на:
umbraco.library:GetXmlNodeById($source)
|
$currentPage[not(umbraco.library:GetXmlNodeById($source))]
Полный <xsl:variable>
Определение:
<xsl:variable name="vCurrent" select=
" umbraco.library:GetXmlNodeById($source)
|
$currentPage[not(umbraco.library:GetXmlNodeById($source))]
"/>
Это может быть написано более компактным способом:
<xsl:variable name="vRealSource" select="umbraco.library:GetXmlNodeById($source)"/>
<xsl:variable name="vCurrent" select=
"$vRealSource| $currentPage[not($vRealSource)]"/>
Другие советы
Всякий раз, когда вы объявляете переменную в XSLT 1.0 без @Select, но с некоторым шаблоном содержимого, тип переменного тока будет иметь фрагмент дерева результата. Переменная удерживает корневой узел этого фрагмента дерева.
Итак, с этим:
<xsl:variable name="source">
<xsl:copy-of select="$currentPage" />
</xsl:variable>
Вы объявляете $source
как корня RTF, содержащий скопировать узлов (я и потомков) в $currentPage
Узел набор.
Вы не можете использовать /
Оператор шага с RTF. Вот почему ты насшишь node-set
функция расширения.
Но, когда ты сказал:
node-set($source)/ancestor-or-self::*
Это будет оцениваться с пустым набором узла, потому что узел корневого узла не предков не является элементом.
РЕДАКТИРОВАТЬ: Если у вас есть два набора узлов, и вы хотите объявить переменную с содержимым одного из двух узлов в зависимости от некоторого условия, вы можете использовать:
<xsl:variable name="current"
select="umbraco.library:GetXmlNodeById($source)[$source > 0]
|$currentPage[0 >= $source]" />