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

Sum function not working when selecting value after matching condition

我正在尝试从 XML 文件中提取值并求和。数据集有一个名为“Pallets”的元素,其中包含“Y”或“N”。因此,如果“Pallets”值等于“Y”,那么我想获得“Amount”中的值。我在这里和互联网上浏览了很多 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 中应用求和,这只会找到一个值,因此您输出的是 single-value 个求和的序列。

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