匹配条件后选择值时,求和函数不起作用

问题描述

我正在尝试从XML文件提取和求和值。数据集具有一个名为“托盘”的元素,其中包含“ Y”或“ N”。因此,如果“托盘”值等于“ Y”,那么我想获取“金额”中的值。我在这里和在互联网上浏览了很多XSL代码,然后想到了下面的代码部分。

<xsl:value-of select=
    "('&#xD;Pallet Amount',$fullPath/LineItemRows/LineItemRow/Fields
              [Field[@Label = 'Pallets']/Value = 'Y']
                     /sum(number(translate(Field[@Label = 'Amount']/Value,','.')
                                 )
                          )
      )"/>

哪个生产以下输出

Pallet Amount 7.21 7.21 14.06

就像你们看到的那样,我的确得到了这些值,但它们并没有汇总。我想要的输出28.48

下面是一组数据样本,与我使用的XML类似(实际文件太大,由我们使用的软件生成)。

<LineItemRows>
        <LineItemRow ID="0" FromPage="1">
          <Fields>                
            <Field ID="a16255ad1e9549b48a9a31d001629b36" Type="Text" Status="Complete" Label="Pallets">
              <Value>N</Value>
            </Field>
            </Field>
            <Field ID="252a9390778540edac6520d3f9f260b8" Type="Text" Status="Complete" Label="Amount">
              <Value>406,74</Value>
            </Field>
          </Fields>
        </LineItemRow>
        <LineItemRow ID="3" FromPage="1">
          <Fields>
            <Field ID="a16255ad1e9549b48a9a31d001629b36" Type="Text" Status="Complete" Label="Pallets">
              <Value>Y</Value>
            </Field>                
            <Field ID="252a9390778540edac6520d3f9f260b8" Type="Text" Status="Complete" Label="Amount">
              <Value>7,21</Value>
            </Field>
          </Fields>
        </LineItemRow>
        <LineItemRow ID="0" FromPage="1">
            <Field ID="a16255ad1e9549b48a9a31d001629b36" Type="Text" Status="Complete" Label="Pallets">
              <Value>N</Value>
            </Field>
            <Field ID="252a9390778540edac6520d3f9f260b8" Type="Text" Status="Complete" Label="Amount">
              <Value>33,92</Value>
            </Field>
          </Fields>
        </LineItemRow>
        <LineItemRow ID="5" FromPage="1">
            <Field ID="a16255ad1e9549b48a9a31d001629b36" Type="Text" Status="Complete" Label="Pallets">
              <Value>Y</Value>
            </Field>                
            <Field ID="252a9390778540edac6520d3f9f260b8" Type="Text" Status="Complete" Label="Amount">
              <Value>7,21</Value>
            </Field>
          </Fields>
        </LineItemRow>
        <LineItemRow ID="6" FromPage="1">
            <Field ID="a16255ad1e9549b48a9a31d001629b36" Type="Text" Status="Complete" Label="Pallets">
              <Value>Y</Value>
            <Field ID="252a9390778540edac6520d3f9f260b8" Type="Text" Status="Complete" Label="Amount">
              <Value>14,06</Value>
            </Field>
          </Fields>
        </LineItemRow>
    </LinItemRows>

我也尝试了其他方法,但实际上没有用。希望我把问题弄清楚。另外,我使用的是xsl version 2.0,但系统也与version 1.0兼容。

解决方法

XPath 2表达式

sum(LineItemRows/LineItemRow/Fields[Field[@Label='Pallets' and Value='Y']]/Field[@Label='Amount']/xs:decimal(translate(Value,','.')))

如果存在用空格填充Y或N值的任何风险,请对该值测试使用normalize-space(Value)='Y'。

您的原始表达式是在LineItemRow内应用求和运算,该求和运算只会找到一个值,因此您要输出这些单值求和的序列。

此处的表达式还使用XMLSchema Decimal类型(对于该表达式中使用的前缀声明名称空间xmlns:xs =“ http://www.w3.org/2001/XMLSchema”)执行求和,而不是使用默认值双精度数字表示形式,应避免不准确,并且需要将总和舍入为两位数。