XPath 2.0中如何计算各节点计算值的总和?
问题
现有如下XML结构,已实现单个Part节点的两种计算:Cost*Qty 或 round((DirectPrice*Qty div 12)*100) div 100(保留两位小数的取整计算)。需求是仅使用XPath 2.0(不能用XSLT函数),将所有Part节点的该计算值求和,并把结果放在文档底部。
示例XML:
<AddPart_Container displayName="Add Sensor(s)" displayValue="Add Sensor(s)"> <Part displayName="Part (Sensor 02)" displayValue="Part (Sensor 02)"> <PartCategory>Hardware</PartCategory> <PartName>Wireless Enterprise Vibration Sensor V3 (1 MP per)</PartName> <PartNumber>PR55-61E</PartNumber> <Cost>366.95</Cost> <DirectPrice>492.95</DirectPrice> <Qty>200</Qty> </Part> <Part displayName="Part (Sensor 04)" displayValue="Part (Sensor 04)"> <PartCategory>Hardware</PartCategory> <PartName>Wireless 3 Channel Current Sensor - 0 to 100 (3 MP per)</PartName> <PartNumber>PR55-26C</PartNumber> <Cost>337.94</Cost> <DirectPrice>492.95</DirectPrice> <Qty>10</Qty> </Part> </AddPart_Container>
单节点计算代码:
<# <Content Select="round((./DirectPrice * ./Qty div 12) * 100) div 100"/> #>
解决方案
XPath 2.0的sum()函数支持对节点序列的计算结果求和,直接把单个节点的计算逻辑嵌套进sum()即可,无需依赖XSLT扩展函数。
1. 基于Cost*Qty的求和表达式
sum(/AddPart_Container/Part/(Cost * Qty))
2. 基于DirectPrice*Qty/12取整后的求和表达式
sum(/AddPart_Container/Part/(round((DirectPrice * Qty div 12) * 100) div 100))
将结果置于文档底部
如果环境支持XPath插入节点,可通过以下表达式在文档末尾添加包含求和结果的节点:
insert node <Total>{sum(/AddPart_Container/Part/(round((DirectPrice * Qty div 12) * 100) div 100))}</Total> into /AddPart_Container[last()]
该表达式会在AddPart_Container的末尾插入一个Total节点,节点内容即为所有Part的计算值总和。
内容的提问来源于stack exchange,提问作者NikkiC
相关产品推荐
相关产品推荐

