我正在学习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>
</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
不是程序语言中存在的for
或foreach
循环意义上的循环,因此任何关于循环的问题都很难理解,也更难回答。
如果你想在XSLT中使用全局变量,你可以这样做,但你需要将一个值绑定到声明它的变量上(即全局),你以后不能像你想做的那样在for-each
中分配值。
- 您已经写过,'XSL是一个过程语言'。。事实并非如此。它是一种声明性语言
- 变量是随声明一起赋值的,变量不会改变
- 通常,我们使用
call-template
对模板进行递归调用,并将参数传递给它们。。(这与过程语言中带有传递参数的递归函数调用类似)
这是一种处理计数和条件循环等的方法
如果您提到示例XML的确切场景,以及您期望的输出,我们将很乐意为您提供帮助:)