我有一个我设置值的变量。此后,在循环中,我想编辑此变量并在下一次迭代中使用它。有什么办法可以编辑变量中的值吗?谢谢!
grad
答案 0 :(得分:2)
在循环中,我想编辑这个变量并在下一次迭代中使用它。有什么办法可以编辑变量中的值吗?
答案是否定的:
XSLT是一种函数式语言,除其他外,这意味着变量的值一旦定义就是不可变的。
通过调用语言的另一个可调用单元(模板或函数)并将所需的新值作为参数传递,可以以更安全的方式实现相同的效果。
<强>予。这是一个简单的例子。以下转换计算整数的阶乘,从源XML文档的document(top)元素的字符串值获得:
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output method="text"/>
<xsl:template match="/*/text()" name="factorial">
<xsl:param name="pN" select="."/>
<xsl:param name="pAccum" select="1"/>
<xsl:value-of select="substring($pAccum, 1 div not($pN > 1))"/>
<xsl:apply-templates select="self::node()[$pN > 1]">
<xsl:with-param name="pN" select="$pN -1"/>
<xsl:with-param name="pAccum" select="$pAccum * $pN"/>
</xsl:apply-templates>
</xsl:template>
</xsl:stylesheet>
将此转换应用于以下源XML文档时:
<t>9</t>
产生了想要的正确结果:
362880
在上面的代码中,我们看到参数$pN
的值如何从调用到调用“减少”,直到达到1
,参数$pAccum
的值每次调用时乘以参数$pN
的值。
请注意,但是,我们根本不修改任何参数 - 在每次调用时,都会创建一个具有相同名称的新参数实例,但是只生活在内在范围内(呼唤)。
<强> II。通常我们可以避免递归的需要:以下XSLT 1.0转换计算并输出从1
到20
的数字的多维数据集:
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output omit-xml-declaration="yes" indent="yes"/>
<xsl:variable name="vDoc" select="document('')"/>
<xsl:template match="/*" name="cubes">
<xsl:param name="pN" select="20"/>
<xsl:for-each select=
"($vDoc//node() | $vDoc//node()/@* | $vDoc//namespace::*)
[not(position() > $pN)]">
<xsl:variable name="vM" select="position()"/>
<xsl:value-of select="$vM*$vM*$vM"/>
<xsl:text>
</xsl:text>
</xsl:for-each>
</xsl:template>
</xsl:stylesheet>
当此转换应用于任何源XML文档(未使用)时,会生成所需的正确结果:
1
8
27
64
125
216
343
512
729
1000
1331
1728
2197
2744
3375
4096
4913
5832
6859
8000
请注意如何调用标准XPath函数position()
来生成“循环计数器”:)。这是众所周知的method of Piez。
从XSLT 2.0及更高版本开始,不需要这样的技巧。可以使用XPath 2.0 range expression :
简单地编写以下内容<xsl:stylesheet version="2.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output omit-xml-declaration="yes" indent="yes"/>
<xsl:variable name="vDoc" select="document('')"/>
<xsl:template match="/*" name="cubes">
<xsl:param name="pN" select="20"/>
<xsl:for-each select="1 to $pN">
<xsl:value-of select=". * . *."/>
<xsl:text>
</xsl:text>
</xsl:for-each>
</xsl:template>
</xsl:stylesheet>
答案 1 :(得分:0)
查看xsl:number
元素 - 您可以执行以下操作:
<xsl:variable name="numberVariable">
<xsl:number/>
</xsl:variable>
<xsl:value-of select="$numberVariable * 2"/>
很难确切地知道你在问题中做了什么,但希望这可以指出你正确的方向。