xslt变量作用域及其用法
我正在学习xslt,有一个问题是关于如何在不同的循环中使用xslt变量。我知道xslt不是过程语言,所以在for循环中声明的变量不能在另一个循环中访问。但有什么方法可以声明全局变量,然后在第一个for循环中赋值,在第二个for循环中使用该变量呢 任何想法都将不胜感激xslt变量作用域及其用法,xslt,Xslt,我正在学习xslt,有一个问题是关于如何在不同的循环中使用xslt变量。我知道xslt不是过程语言,所以在for循环中声明的变量不能在另一个循环中访问。但有什么方法可以声明全局变量,然后在第一个for循环中赋值,在第二个for循环中使用该变量呢 任何想法都将不胜感激 感谢xsl:for each在for或foreach意义上不是循环,循环存在于过程语言中,因此任何关于循环的问题都很难理解,也更难回答 如果您想在XSLT中使用全局变量,您可以这样做,但是您需要将一个值绑定到声明它的变量(即全局变量
感谢
xsl:for each
在for
或foreach
意义上不是循环,循环存在于过程语言中,因此任何关于循环的问题都很难理解,也更难回答
如果您想在XSLT中使用全局变量,您可以这样做,但是您需要将一个值绑定到声明它的变量(即全局变量),以后您不能像您希望的那样在中为每个
分配一个值
calltemplate
将参数传递给模板,然后对模板执行递归调用。。(这类似于在过程语言中使用传递参数的递归函数调用)
这是一种处理计数和条件循环等的方法
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>
还可以使用递归调用的命名模板模拟“分配”具有不同值的变量,并将“新值”作为参数传递给调用的模板
下面是一个显示此技术的示例。这里我们计算的是节点集的节点中包含的最大值。每次访问节点集中的下一个节点时,都会将当前最大值与该值进行比较,如有必要,新的最大值将成为下一个节点的值。然后,我们递归调用同一模板,将新的最大值作为当前最大值传递:
<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