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

XPTY0004:不允许包含多个项目的序列作为'*'的第一个操作数

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

<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>

这个StackOverflow问题的答案对我很有吸引力 ,但我似乎无法使它工作。

我正在使用Saxonica的Saxon-HE 9.5.1.1N,使用Visual Studio 2013。

编辑我能够得到一些适用于XSL 2的东西,但需要为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)"/>

#1楼 票数:2 已采纳

要按照您链接到的问题中的示例,您将在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中进行此求和涉及更多,并且通常涉及使用递归模板或node-set()函数的某些表现形式。 以下是后者的一个例子:

<xsl:stylesheet version="1.0"
                xmlns:ex="http://exslt.org/common"
                xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
  <xsl:output method="text"/>

  <xsl:template match="/">
    <!-- determine $test_id however you need to -->
    <xsl:variable name="products">
      <xsl:for-each 
           select="/group/fooList/foo[attributeList/Attribute/@ID = $test_id]">
        <product>
          <xsl:value-of select="attributeList/Attribute/@Weight * 
                                Properties/PhysicalProperties/Volume/@Average" />
        </product>
      </xsl:for-each>
    </xsl:variable>

    <xsl:value-of select="sum(ex:node-set($products)/product)"/>
  </xsl:template>

</xsl:stylesheet>

#2楼 票数:1

为了完整性,如果要在XSLT 1.0中总结计算数量,有三种方法:

(a)递归:编写一个递归模板,逐个处理序列中的项目,计算总数。

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

(c)使用XSLT供应商提供的扩展功能,或者使用供应商提供的设施进行用户编写以调用外部功能。

在XSLT 2.0中,始终可以使用构造完成

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

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

  ask by Kevin K translate from so

未解决问题?本站智能推荐:

1回复

乘以2个过滤后的数字和总和

我需要根据这个例子总结2个数字的乘法 我想得到的结果是下面的结果 任何提示如何获得它? 我尝试了这个例子,但是moltiplication的总和不起作用,只有总和或乘法,但不是两个都可以
1回复

使用XSLT乘以节点值

我需要获取来自同一XML文件中两个不同节点的值。 例如,我的xml: 我想获得相当于50美元的欧元。 我试过了 : 但这没有用。 另外,我必须使用XSLT 1.0。 我该如何用欧元获得该价值?
1回复

XSL将值乘以选择值中的值

我有这段代码: 哪个可以正确输出我想要的整数,但是现在在另一个字段中,我想通过qty_ordered的值来使之qty_ordered 。 所以我尝试的是: 不幸的是,这行不通,而且我不知道该怎么做,任何人都可以帮助我生成一行输出id2686/value * qty_ordere
1回复

在XSLT中划分和乘以选择值

只想在div之后将选择值乘以1000000,这是非常新的; 我相信这对某人来说是一个简单的问题。 提前致谢。 想要乘以1000000,不要认为这是正确的,因此返回不正确的值 续:拥有以下XML 需要转变为 使用XSL 虽然收到了 假设取X值并除
2回复

XSLT:基于属性值的总和

我有这个文档,我想使用 XSLT 将其转换为 HTLM 文档。 我想按城市总结价格,这意味着我将有以下输出: Chicago 89 New York 144 Washington 147 Philadeplhia 73 XML 输入 <?xml version="1.0" encodi
1回复

XSLT唯一值和值的总和

我有以下XML 我有以下XSLT工作表: 显示... 我想要做的是,在每个DISTINCT“成本代码”(C副本和D-法院)上显示每行金额的总和,而不是每个成本代码及其金额。 看起来像: 这是可能吗? 先感谢您。
1回复

我可以在xsl中存储值的总和吗?

假设我有一个Xml片段,我正在使用XSL: 基本上,我想做的是,当我遍历每个节点时,我需要存储要用于当前Column节点的先前“ width”属性的总和。 例如,当我到达最后一个“列”节点(宽度为33)时,我想访问某种变量(100 + 50 + 75)中所有先前宽度的总和。 我知道变
1回复

XSL-将“ space-after”属性的值乘以一个参数

我想根据参数的值为“空格”设置一个不同的值 这是我的xsl的一部分: 所以基本上我想做的就是换线 至 但这给我一个错误: 所以,我想您知道我在尝试做什么。 还有什么其他方法可以解决我的问题 谢谢。