在匹配条件后选择值时求和函数不起作用
Sum function not working when selecting value after matching condition
我正在尝试从 XML 文件中提取值并求和。数据集有一个名为“Pallets”的元素,其中包含“Y”或“N”。因此,如果“Pallets”值等于“Y”,那么我想获得“Amount”中的值。我在这里和互联网上浏览了很多 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 中应用求和,这只会找到一个值,因此您输出的是 single-value 个求和的序列。
此处的表达式还使用 XMLSchema Decimal 类型执行求和(为该表达式中使用的前缀声明命名空间 xmlns:xs="http://www.w3.org/2001/XMLSchema")而不是默认的双精度数字表示,这应该避免不准确和需要将总和四舍五入到两位数。
我正在尝试从 XML 文件中提取值并求和。数据集有一个名为“Pallets”的元素,其中包含“Y”或“N”。因此,如果“Pallets”值等于“Y”,那么我想获得“Amount”中的值。我在这里和互联网上浏览了很多 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 中应用求和,这只会找到一个值,因此您输出的是 single-value 个求和的序列。
此处的表达式还使用 XMLSchema Decimal 类型执行求和(为该表达式中使用的前缀声明命名空间 xmlns:xs="http://www.w3.org/2001/XMLSchema")而不是默认的双精度数字表示,这应该避免不准确和需要将总和四舍五入到两位数。