如何使用XPath对XML表格中的同名行进行聚合求和?
问题解答
首先,你提供的源XML存在标签闭合错误(部分<R1>未闭合、末尾空<Line>无效),先修正为合法的XML结构才能正常解析:
<Table Type="Main"> <Line> <R1> <Name>Jane</Name> <Orders>12</Orders> </R1> </Line> <Line> <R1> <Name>Mark</Name> <Orders>7</Orders> </R1> </Line> <Line> <R1> <Name>Jane</Name> <Orders>11</Orders> </R1> </Line> <Line> <R1> <Name>Adam</Name> <Orders>17</Orders> </R1> </Line> </Table>
仅用XPath能否实现聚合求和?
这取决于你使用的XPath版本:
1. XPath 1.0
无法直接实现。XPath 1.0没有内置分组、聚合函数,只能完成节点筛选,没法按Name分组并对Orders求和。必须借助宿主语言(如Python的lxml、Java DOM解析器)或XSLT 1.0配合实现。
2. XPath 2.0及以上(含3.0/3.1)
可以实现。XPath 2.0+支持distinct-values()、sum()及for表达式,能完成分组聚合:
获取所有唯一
Name值:distinct-values(/Table/Line/R1/Name)对每个唯一
Name对应的Orders求和,生成结构化结果:for $name in distinct-values(/Table/Line/R1/Name) return element Result { element Name { $name }, element TotalOrders { sum(/Table/Line/R1[Name = $name]/Orders/xs:integer(.)) } }
该表达式会输出以下结构:
<Result> <Name>Jane</Name> <TotalOrders>23</TotalOrders> </Result> <Result> <Name>Mark</Name> <TotalOrders>7</TotalOrders> </Result> <Result> <Name>Adam</Name> <TotalOrders>17</TotalOrders> </Result>
是否需要修改源表格?
不需要修改源表格的业务数据,但必须先修正XML的语法错误(标签闭合问题),否则任何XML解析工具都无法正常处理文档。
内容的提问来源于stack exchange,提问作者Tommy K
相关产品推荐
相关产品推荐

