问题描述
我正在尝试从XML文件提取和求和值。数据集具有一个名为“托盘”的元素,其中包含“ Y”或“ N”。因此,如果“托盘”值等于“ Y”,那么我想获取“金额”中的值。我在这里和在互联网上浏览了很多XSL代码,然后想到了下面的代码部分。
<xsl:value-of select=
"('
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”)执行求和,而不是使用默认值双精度数字表示形式,应避免不准确,并且需要将总和舍入为两位数。