Xml 复制XSLT变量

Xml 复制XSLT变量,xml,xslt,variables,umbraco,Xml,Xslt,Variables,Umbraco,我正在开发一个Umbraco XSL样式表,我被卡住了 基本上,我有一个参数,我测试并使用它的值,如果它存在,否则我使用默认参数$currentPage 以下是参数 <xsl:param name="source" select="/macro/sourceId" /> <xsl:param name="currentPage" /> <xsl:variable name="source" select="$currentPage" /> 当您在XSLT1

我正在开发一个Umbraco XSL样式表,我被卡住了

基本上,我有一个参数,我测试并使用它的值,如果它存在,否则我使用默认参数
$currentPage

以下是参数

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

当您在XSLT1.0中声明一个变量时,如果没有@select,但有一些内容模板,那么该变量类型将是结果树片段。该变量保存此树片段的根节点

因此,有了这个:

<xsl:variable name="source"> 
  <xsl:copy-of select="$currentPage" />
</xsl:variable> 
这将计算为空节点集,因为根节点没有祖先,而不是元素

编辑:如果您有两个节点集,并且您希望根据某些条件声明包含两个节点集之一内容的变量,则可以使用:

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

通常,此表达式根据给定条件是
true()
还是
false()

$ns1[$cond] | $ns2[not($cond)]
在您的情况下,这可以翻译为

    umbraco.library:GetXmlNodeById($source) 
|
    $currentPage[not(umbraco.library:GetXmlNodeById($source))]
<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)]"/>
完整的
定义为:

    umbraco.library:GetXmlNodeById($source) 
|
    $currentPage[not(umbraco.library:GetXmlNodeById($source))]
<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)]"/>

这可以用更简洁的方式编写

    umbraco.library:GetXmlNodeById($source) 
|
    $currentPage[not(umbraco.library:GetXmlNodeById($source))]
<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)]"/>


XSLT1还是XSL2?$currentPage在哪里定义?它的类型是什么?您好@Jim,它是XSLT 1.0(Umbraco),而$currentPage是一个内置参数,它包含当前页面及其子节点的节点集。我试图@Jim所做的就是根据测试为
$source
使用不同的值。您能解释一下您看到的与预期不匹配的行为吗?“这不行”是不够的。@Jim,你不明白问题的哪一部分?我有一个名为$currentPage的参数,它包含一个节点集。当我尝试使用
复制参数时,我得到了预期的输出(节点集)。当我尝试在
中使用
复制参数时,我得到的是文本,而不是预期的XML输出。谢谢@Alejandro,您建议我在这种情况下做什么?我基本上是在测试的基础上尝试有一个不同的来源$currentPage本身和使用@select时都可以正常工作。@Marko Ivanovski:请参阅我的编辑以获得解决方案。请注意,条件应该是互斥的,并注意上下文(由于变量引用,这两个条件是上下文“自由的”)。嗯,我不能让它工作,它不会输出任何东西。在这种情况下()到底做什么?它是否检查空字符串或其他内容?我将not($vRealSource)更改为not($source),现在它可以工作了。非常感谢,非常感谢。