Xslt 相乘值之和

Xslt 相乘值之和,xslt,Xslt,我有一个相当复杂的XML文件,需要使用XSL对其中的几个值进行加权平均。我能够完成权重或值的总和,但我不能让乘法工作。我得到一个错误: XPTY0004:不允许将多个项目的序列作为第一个项目 “*”的操作数 我无法共享XML,但我已将XML简化为以下示例,假设有大量的FOO: <group> <fooList> <foo> <attributeList> <Attribute ID="1" We

我有一个相当复杂的XML文件,需要使用XSL对其中的几个值进行加权平均。我能够完成权重或值的总和,但我不能让乘法工作。我得到一个错误:

XPTY0004:不允许将多个项目的序列作为第一个项目 “*”的操作数

我无法共享XML,但我已将XML简化为以下示例,假设有大量的FOO:

<group>
<fooList>
    <foo>
        <attributeList>
            <Attribute ID="1" Weight="0.5">
                <otherParams />
            </Attribute>
        </attributeList>
        <Properties>
            <PhysicalProperties>
                <Volume Average="125" Unknown="50" />
            </PhysicalProperties>
        </Properties>
     </foo>
</fooList>
</group>
我目前试图获得加权平均值的方法如下:

<xsl:variable name="WeightedVolume" select="sum(/group/fooList/foo[attributeList/Attribute/[@ID=$test_id]]/attributeList/Attribute/@Weight * /group/fooList/foo[attributeList/Attribute/[@ID=$test_id]]/Properties/PhysicalProperties/Volume/@Average)"/>
我知道也有类似的问题,但大多数问题都是关于foo的求和和和乘法

<foo>
    <Weight>0.5</Weight>
    <VolumeAverage>125</VolumeAverage>
</foo>
这个问题的答案对我很有吸引力,但我似乎无法让它起作用

我正在使用Saxonica的Saxon HE 9.5.1.1N和Visual Studio 2013

编辑 我能够为XSL2做一些工作,但需要为XSL1做一个后援

<xsl:variable name="WeightedVolume" select="sum(for $i in /group/FooList/foo[attributeList/Attribute[@ID=$test_id] return $i/AttributeList/Attribute/@Weight * $i/Properties/PhysicalProperties/Volume/@Average)"/>

要遵循链接到的问题中的示例,可以在XSLT 2.0/XPath 2.0中使用:

<xsl:variable name="FoosToCalculate"
              select="/group/fooList/foo[attributeList/Attribute/@ID = $test_id]" />
<xsl:variable name="WeightedVolume" 
              select="sum($FoosToCalculate/(attributeList/Attribute/@Weight * 
                                 Properties/PhysicalProperties/Volume/@Average)
                          )"/>

为了完整起见,如果您想在XSLT 1.0中对计算出的数量求和,有三种方法:

递归:编写一个递归模板,逐项处理序列中的项目,并在执行时计算总数

b创建一个XML树,其中计算的数量是节点值,然后使用sum函数处理该树。要在单个样式表中执行此操作,您将需要exslt:node set扩展函数

c使用XSLT供应商提供的扩展函数,或使用供应商提供的用于调用外部函数的工具编写的用户

在XSLT2.0中,始终可以使用构造来完成

sum(for $x in node-set return f($x))

其中f是一个计算数量的函数。

您能为我们提供一些有效的XML吗?属性是Attribute、otherParams、foo或其他属性的子级吗?您尝试的路径表明它是Attribute的子级,但您的XML示例表明它是who knows的子级。@kevin,使用XSLT 1.0,您不能使用纯XPath,您必须编写带参数的递归模板。在这里可以找到如何做到这一点的好例子:@matthias_h OP已经链接到他问题中的帖子:@JLRishe感谢您提供的信息,并向Kevin表示抱歉,请过目。JLRishe-我将使用此答案,因为它解决了手头的两个问题。我能够使它在演示XML上工作,现在必须将其转换为真实版本。谢谢大家!我让它大部分工作,但我有一些问题与你的例子行。这应该是吗?@KevinKennedy对不起,应该是这样的,我注意到还有一个错误。请看我的编辑。
sum(for $x in node-set return f($x))