将 2 个数字相乘,然后求和
我很难尝试做一些看起来应该很容易做的事情。 我基本上想将一个节点中的 2 个数字相乘,然后将所有节点的这些数字相加。 这是我尝试过的 XSLT 代码。
<xsl:value-of select="sum(Parts/Part/Quantity * Parts/Part/Rate)"/>
此代码会导致错误“函数 sum 的参数 1 无法转换为节点集”。
有谁知道出了什么问题或者我如何完成我想做的事情?
I am having a difficult time trying to do something that seems like it should be really easy to do. I basically want to multiply 2 numbers in a node and then sum the total of those numbers for all the nodes. Here is the XSLT code I have tried.
<xsl:value-of select="sum(Parts/Part/Quantity * Parts/Part/Rate)"/>
This code results in an error that says "Argument 1 of function sum cannot be converted to a node set."
Does anyone have an idea of what is wrong or how I can accomplish what I am trying to do?
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(2)
以下是三种可能的解决方案:
解决方案1 XSLT2:
当此转换应用于以下 XML 文档时:
生成所需的结果:
4
XSLT 2.0 解决方案使用了以下事实:XPath 2.0 允许最后一个“/”的正确参数运算符可以是表达式,通常也可以是函数。 该表达式/函数应用于迄今为止选择的作为上下文节点的每个节点,并且每个函数应用产生一个结果。
解决方案2 XSLT 1.0:
当应用于上述XML 文档时,会产生正确的结果:
4
这是一个典型的XSLT 1.0 递归解决方案。 请注意
sumProducts
模板如何递归调用自身,直到处理完参数$pList
中传递的整个输入列表。解决方案3 FXSL (XSLT 1.0):
当此转换应用于以下 XML 文档时:
生成正确的结果:
7.5600000000000005
在每个
销售的最后一种情况< /code> 我们计算
价格
、数量
和所有可用(可变数量)折扣
的乘积。FXSL 是高阶函数的纯 XSLT 实现。 在此示例中,使用高阶函数
f:map()
将函数f:product()
映射到每个 < 的子级列表上代码>销售元素。 然后将结果相加得出最终结果。Here are three possible solutions:
Solution1 XSLT2:
When this transformation is applied on the following XML document:
The wanted result is produced:
4
The XSLT 2.0 solution uses the fact that in XPath 2.0 it is allowed that the right argument of the last "/" operator can be an expression or generally a function. This expression/function is applied for each of the nodes selected so far acting as the context node, and each function application produces one result.
Solution2 XSLT 1.0:
When applied on the above XML document, the correct result is produced:
4
This is a typical XSLT 1.0 recursive solution. Do note how the
sumProducts
template calls itself recursively, until the entire input list, passed in the parameter$pList
is processed.Solution3 FXSL (XSLT 1.0):
When this transformation is applied on the following XML document:
The correct result is produced:
7.5600000000000005
In the last case for each
sale
we calculate the product ofprice
,quantity
and all available (variable number of)discount
-s.FXSL is a pure XSLT implementation of higher order functions. In this example the higher-order function
f:map()
is used to map the functionf:product()
on the list of children of everysale
element. Then the results are summed to produce the final result.Dimitre 的所有解决方案都有效,他是对的,您不需要使用扩展函数,但有时它会让生活变得更轻松。 它并不太有害,特别是当您使用跨多个 XSLT 处理器支持的 exslt 扩展时。 此外,出现序列错误的原因可能是因为您使用的是 XSLT 1 处理器。
如果您想坚持选择的解决方案,则需要使用 Saxon 或其他支持 XSLT 2 的 XSLT 处理器。
否则,这里有在 XSLT 1 中执行此操作的替代方法。这适用于大多数 XSLT 处理器和某些人可能会发现它比递归版本更容易理解。 就我个人而言,我更喜欢递归版本(Dimitre 的第三个提案),因为它更便携。
All of Dimitre's solutions work and he's right that you don't need to use extension functions but sometimes it makes life easier. It's not too harmful, especially when you use exslt extensions which are supported across multiple XSLT processors. Also, the reason you're getting the sequence errors is probably because you're using an XSLT 1 processor.
If you want to persist with your chosen solution, you'll need to use Saxon or some other XSLT processor that supports XSLT 2.
Otherwise, here's an alternative method of doing it in XSLT 1. This will work in most XSLT processors and some peope might find it easier to grok than the recursive version. Personally, I prefer the recursive version (Dimitre's 3rd proposal) because it is more portable.