xslt变量范围及其用法



我正在学习xslt,有一个问题是如何在diff.中为每个循环使用xslt变量。我知道xslt不是一种过程语言,所以在for循环中声明的变量不能在另一个循环中访问。但有没有什么方法可以声明全局变量,然后在第一个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>

当此转换应用于以下XML文档时。。。

<nums>
  <num>01</num>
  <num>02</num>
  <num>03</num>
  <num>04</num>
  <num>05</num>
  <num>06</num>
  <num>07</num>
  <num>08</num>
  <num>09</num>
  <num>10</num>
</nums>

它首先定义一个CCD_ 4变量,该变量从其主体中包含的CCD_。

然后在第二个xsl:for-each中使用vMax变量来输出"接近"如此计算的最大值的所有数字。

生成所需的正确结果

     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>

将此转换应用于同一XML文档(如上)时,会产生所需的正确结果

10

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

如果你想在XSLT中使用全局变量,你可以这样做,但你需要将一个值绑定到声明它的变量上(即全局),你以后不能像你想做的那样在for-each中分配值。

  1. 您已经写过,'XSL是一个过程语言'。。事实并非如此。它是一种声明性语言
  2. 变量是随声明一起赋值的,变量不会改变
  3. 通常,我们使用call-template对模板进行递归调用,并将参数传递给它们。。(这与过程语言中带有传递参数的递归函数调用类似
    这是一种处理计数和条件循环等的方法

如果您提到示例XML的确切场景,以及您期望的输出,我们将很乐意为您提供帮助:)

最新更新