xslt变量范围及其用法

use*_*755 7 xslt

我正在学习xslt并且有一个关于如何在diff中使用xslt变量的问题.对于每个循环.我知道xslt不是一个过程语言,因此在for循环中声明的变量不能在另一个循环中访问.但有没有什么方法可以声明全局变量然后在第一个for循环中分配一些值并在第二个for循环中使用该变量?

任何想法都将受到高度赞赏.

谢谢

Dim*_*hev 14

有什么方法我可以只声明全局变量然后在第一个for循环中分配一些值并在第二个for循环中使用该变量?

xsl:variable从一个内部分配值(当然这只是初始化)的方法xsl:for-eachxsl: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>
Run Code Online (Sandbox Code Playgroud)

当此转换应用于以下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>
Run Code Online (Sandbox Code Playgroud)

...它首先定义一个vMax变量,xsl:for-each从其体内包含的值中获取其值.

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

产生了想要的正确结果:

     Values close to the maximum:
07
08
09
10
Run Code Online (Sandbox Code Playgroud)

还可以通过使用递归调用的命名模板来模拟"赋值"具有不同值的变量,并将"新值"作为参数传递给被调用模板.

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

<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>
Run Code Online (Sandbox Code Playgroud)

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

10
Run Code Online (Sandbox Code Playgroud)