【发布时间】:2014-10-27 00:33:27
【问题描述】:
XPath 2.0(和 3.0)具有方便的聚合函数 sum() 和 avg(),但没有返回数值原子值序列的乘积。
虽然在允许赋值语句的语言中实现这样的函数是微不足道的,但在 XSLT 中似乎并不那么容易。我发现获得聚合产品的唯一方法是使用递归:
<xsl:function name="fn:products">
<xsl:param name="input" />
<xsl:param name="total" />
<xsl:if test="exists($input)">
<xsl:variable name="x" select="$input[1] * $total"/>
<xsl:sequence select="$x"/>
<xsl:sequence select="fn:products(subsequence($input,2),$x)"/>
</xsl:if>
</xsl:function>
但以上实际上是我对 Michael Kay 的书 XSLT 2.0 和 XPath 2.0 4th Edition 的 p.994 中出现的一个函数的改编。原始函数通过递归添加一个数字序列来输出一个运行余额序列。
我的版本只是将数字相乘,而不是相加。结果是一系列“运行产品”。例如,fn:products((4, 0.75, 10, 0.7), 1) 返回序列 4, 3, 30, 21。
由于我只对所有数字的乘积感兴趣,因此我只使用过滤器表达式获取输出的最后一项:fn:products((4, 0.75, 10, 0.7), 1)[last() ]。
它有效。但是只是为了编写好的代码,我想知道是否有一种方法可以使函数直接将最后一项作为聚合产品返回(即在上面的示例中只得到 21)。
我尝试了几件事,但他们只是破坏了功能。有没有办法做到这一点?是否也可以以更好、更精简的方式实现它(原始函数并不是要返回单例序列)?
【问题讨论】:
标签: xslt