xslt变量作用域及其用法

xslt变量作用域及其用法,xslt,Xslt,我正在学习xslt,有一个问题是关于如何在不同的循环中使用xslt变量。我知道xslt不是过程语言,所以在for循环中声明的变量不能在另一个循环中访问。但有什么方法可以声明全局变量,然后在第一个for循环中赋值,在第二个for循环中使用该变量呢 任何想法都将不胜感激 感谢xsl:for each在for或foreach意义上不是循环,循环存在于过程语言中,因此任何关于循环的问题都很难理解,也更难回答 如果您想在XSLT中使用全局变量,您可以这样做,但是您需要将一个值绑定到声明它的变量(即全局变量

我正在学习xslt,有一个问题是关于如何在不同的循环中使用xslt变量。我知道xslt不是过程语言,所以在for循环中声明的变量不能在另一个循环中访问。但有什么方法可以声明全局变量,然后在第一个for循环中赋值,在第二个for循环中使用该变量呢

任何想法都将不胜感激


感谢
xsl:for each
for
foreach
意义上不是循环,循环存在于过程语言中,因此任何关于循环的问题都很难理解,也更难回答

如果您想在XSLT中使用全局变量,您可以这样做,但是您需要将一个值绑定到声明它的变量(即全局变量),以后您不能像您希望的那样在
中为每个
分配一个值

  • 您已经写过,“XSL是一个过程语言”。。嗯,不是。它是一种声明性语言
  • 变量随声明一起赋值,变量不变
  • 通常,我们使用
    calltemplate
    将参数传递给模板,然后对模板执行递归调用。。(这类似于在过程语言中使用传递参数的递归函数调用)
    这是一种处理计数和条件循环等的方法
  • 如果您提到示例XML的确切场景,以及您期望从中获得的输出,我们将很乐意为您提供帮助:)

    有没有什么方法可以声明全局变量,然后分配一些 第一个for循环中的值,第二个for循环中使用该变量

    xsl:for each
    中为
    xsl:variable
    赋值的方法是在变量体中包含
    xsl:for each

    下面是一个完整的示例:

    <xsl:stylesheet version="1.0"
     xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
     <xsl:output omit-xml-declaration="yes" indent="yes"/>
     <xsl:strip-space elements="*"/>
    
     <xsl:template match="/*">
         <xsl:variable name="vMax">
           <xsl:for-each select="num">
            <xsl:sort data-type="number" order="descending"/>
    
            <xsl:if test="position() = 1">
             <xsl:value-of select="."/>
            </xsl:if>
           </xsl:for-each>
         </xsl:variable>
    
         Values close to the maximum:
    <xsl:text/>
    
           <xsl:for-each select="num">
            <xsl:if test="not($vMax - . > 3) ">
             <xsl:value-of select="."/>
             <xsl:text>&#xA;</xsl:text>
            </xsl:if>
           </xsl:for-each>
     </xsl:template>
    </xsl:stylesheet>
    
    还可以使用递归调用的命名模板模拟“分配”具有不同值的变量,并将“新值”作为参数传递给调用的模板

    下面是一个显示此技术的示例。这里我们计算的是节点集的节点中包含的最大值。每次访问节点集中的下一个节点时,都会将当前最大值与该值进行比较,如有必要,新的最大值将成为下一个节点的值。然后,我们递归调用同一模板,将新的最大值作为当前最大值传递:

    <xsl:stylesheet version="1.0"
     xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
     <xsl:output omit-xml-declaration="yes" indent="yes"/>
     <xsl:strip-space elements="*"/>
    
     <xsl:template match="/*">
      <xsl:call-template name="max">
        <xsl:with-param name="pList" select="*"/>
      </xsl:call-template>
     </xsl:template>
    
     <xsl:template name="max">
       <xsl:param name="pMax" select="-99999999"/>
       <xsl:param name="pList"/>
    
       <xsl:choose>
         <xsl:when test="$pList[1]">
           <xsl:variable name="vnewMax" select=
           "$pMax * ($pMax >= $pList[1])
           +
            $pList[1] * not($pMax >= $pList[1])
           "/>
    
           <xsl:call-template name="max">
            <xsl:with-param name="pMax" select="$vnewMax"/>
            <xsl:with-param name="pList" select="$pList[position() > 1]"/>
           </xsl:call-template>
         </xsl:when>
         <xsl:otherwise>
           <xsl:value-of select="$pMax"/>
         </xsl:otherwise>
       </xsl:choose>
     </xsl:template>
    </xsl:stylesheet>
    

    那么,我如何获得两个不同字段的值以供以后使用呢?只需定义两个变量并将每个变量初始化为相应的“字段”。关于“以后”——函数式语言中没有这样的东西。评估可以按任何顺序和/或顺序进行parallel@LuckyLikey,检查问题的编辑历史记录,Dimitri已更正。之前是“我知道XSLT是一种过程语言”
         Values close to the maximum:
    07
    08
    09
    10
    
    <xsl:stylesheet version="1.0"
     xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
     <xsl:output omit-xml-declaration="yes" indent="yes"/>
     <xsl:strip-space elements="*"/>
    
     <xsl:template match="/*">
      <xsl:call-template name="max">
        <xsl:with-param name="pList" select="*"/>
      </xsl:call-template>
     </xsl:template>
    
     <xsl:template name="max">
       <xsl:param name="pMax" select="-99999999"/>
       <xsl:param name="pList"/>
    
       <xsl:choose>
         <xsl:when test="$pList[1]">
           <xsl:variable name="vnewMax" select=
           "$pMax * ($pMax >= $pList[1])
           +
            $pList[1] * not($pMax >= $pList[1])
           "/>
    
           <xsl:call-template name="max">
            <xsl:with-param name="pMax" select="$vnewMax"/>
            <xsl:with-param name="pList" select="$pList[position() > 1]"/>
           </xsl:call-template>
         </xsl:when>
         <xsl:otherwise>
           <xsl:value-of select="$pMax"/>
         </xsl:otherwise>
       </xsl:choose>
     </xsl:template>
    </xsl:stylesheet>
    
    10