代码之家  ›  专栏  ›  技术社区  ›  Marko

复制XSLT变量

  •  7
  • Marko  · 技术社区  · 14 年前

    我正在开发一个Umbraco XSL样式表,我很困。

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

    这是参数

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

    这是变量

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

    这就是我使用它的地方

    <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 &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>
    
    2 回复  |  直到 14 年前
        1
  •  6
  •   Dimitre Novatchev    14 年前

    通常,此表达式根据给定条件是否为 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)]"/>
    
        2
  •  2
  •   user357812    14 年前

    无论何时在不带@select但带有某些内容模板的XSLT 1.0中声明变量,变量类型都将是结果树片段。变量保存此树片段的根节点。

    因此,用这个:

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

    你要申报 $source 作为包含 复制 中的节点(自身和子节点) $currentPage 节点集。

    你不能用 / 带RTF的步进操作员。这就是为什么你要打 node-set 扩展功能。

    但是 当你说:

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

    这将被计算为空节点集,因为根节点没有祖先,也不是元素。

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

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