xslt-2.0 - 在 xslt 中将两条记录连接成一条记录
问题描述
要求
<Records>
<Record>
<ACCOUNT>460029</ACCOUNT>
<ENTITY>1851</ENTITY>
<UD1>FY17</UD1>
<UD2>457001</UD2>
<UD3>116029</UD3>
<UD4>0</UD4>
<UD5>458004</UD5>
<UD6>Dec</UD6>
<UD7>DeferredIncome</UD7>
<AMOUNT>0</AMOUNT>
</Record>
<Record>
<ACCOUNT>460029</ACCOUNT>
<ENTITY>1851</ENTITY>
<UD1>FY17</UD1>
<UD2>457001</UD2>
<UD3>116029</UD3>
<UD4>0</UD4>
<UD5>458004</UD5>
<UD6>Dec</UD6>
<UD7>OutsBalance</UD7>
<AMOUNT>3400</AMOUNT>
</Record>
<Record>
<ACCOUNT>460029</ACCOUNT>
<ENTITY>1851</ENTITY>
<UD1>FY17</UD1>
<UD2>457002</UD2>
<UD3>116029</UD3>
<UD4>0</UD4>
<UD5>458008</UD5>
<UD6>Jan</UD6>
<UD7>DeferredIncome</UD7>
<AMOUNT>20</AMOUNT>
</Record>
<Record>
<ACCOUNT>460029</ACCOUNT>
<ENTITY>1851</ENTITY>
<UD1>FY17</UD1>
<UD2>457002</UD2>
<UD3>116029</UD3>
<UD4>0</UD4>
<UD5>458008</UD5>
<UD6>Jan</UD6>
<UD7>OtsBalance</UD7>
<AMOUNT>0</AMOUNT>
</Record>
</Records>
回复
<Records>
<Record>
<ACCOUNT>460029</ACCOUNT>
<ENTITY>1851</ENTITY>
<UD1>FY17</UD1>
<UD2>457001</UD2>
<UD3>116029</UD3>
<UD4>0</UD4>
<UD5>458004</UD5>
<UD6>Dec</UD6>
<DeferredIncome>0</DeferredIncome>
<OutsBalance>3400</OutsBalance>
</Record>
<Record>
<ACCOUNT>460029</ACCOUNT>
<ENTITY>1851</ENTITY>
<UD1>FY17</UD1>
<UD2>457002</UD2>
<UD3>116029</UD3>
<UD4>0</UD4>
<UD5>458008</UD5>
<UD6>Jan</UD6>
<DeferredIncome>20</DeferredIncome>
<OutsBalance>0</OutsBalance>
</Record>
</Records>
<br/>
我有一个要求,我需要在 xslt 中将两条记录合并为一条记录。
将有超过 1000 条记录,因此在 for-each 中运行 for-each 会增加迭代次数。
有没有更好的方法?任何帮助表示赞赏。基本上每个唯一记录(从 Amount 到 UD7)将有两条记录 defredAmount 和 outsBalance。需要将这两个记录与 deferedAmount 和 outsBalance 结合起来
解决方案
正如我已经在评论中建议的那样,这似乎是一个使用新 XSLT 3 特性的教科书案例for-each-group group-by composite="yes"
,即使用您想要用作group-by
表达式的分组键的一系列项目并用它来指示composite="yes"
所有它们形成了组合项目的组合键。
因此,对于您使用 XSLT 3 代码的示例
<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
xmlns:xs="http://www.w3.org/2001/XMLSchema"
exclude-result-prefixes="#all"
expand-text="yes"
version="3.0">
<xsl:mode on-no-match="shallow-copy"/>
<xsl:output method="xml" indent="yes"/>
<xsl:template match="Records">
<xsl:copy>
<xsl:for-each-group select="Record" group-by="*[position() le 8]" composite="yes">
<xsl:copy>
<xsl:apply-templates select="* except (UD7, AMOUNT)"/>
<DeferredIncome>{ sum(current-group()[UD7 = 'DeferredIncome']/AMOUNT) }</DeferredIncome>
<OutsBalance>{ sum(current-group()[UD7 = ('OtsBalance', 'OutsBalance')]/AMOUNT) }</OutsBalance>
</xsl:copy>
</xsl:for-each-group>
</xsl:copy>
</xsl:template>
</xsl:stylesheet>
在https://xsltfiddle.liberty-development.net/bdxtqC输出
<?xml version="1.0" encoding="UTF-8"?>
<Records>
<Record>
<ACCOUNT>460029</ACCOUNT>
<ENTITY>1851</ENTITY>
<UD1>FY17</UD1>
<UD2>457001</UD2>
<UD3>116029</UD3>
<UD4>0</UD4>
<UD5>458004</UD5>
<UD6>Dec</UD6>
<DeferredIncome>0</DeferredIncome>
<OutsBalance>3400</OutsBalance>
</Record>
<Record>
<ACCOUNT>460029</ACCOUNT>
<ENTITY>1851</ENTITY>
<UD1>FY17</UD1>
<UD2>457002</UD2>
<UD3>116029</UD3>
<UD4>0</UD4>
<UD5>458008</UD5>
<UD6>Jan</UD6>
<DeferredIncome>20</DeferredIncome>
<OutsBalance>0</OutsBalance>
</Record>
</Records>
我不确定是否UD7 = ('OtsBalance', 'OutsBalance')
由于示例数据中的拼写错误而需要进行检查,或者您的真实数据是否需要检查,因为它包含该元素值的不同拼写。
推荐阅读
- java - 如何在 mysql SELECT 查询中使用文本字段输入
- c# - Json表单MVC模型怎么做
- java - 通过传入 char 变量从列表中打印所有字符串
- numpy - 如何在两张图片之间交换颜色?
- postgresql - 在 postgres 中将文本/字符串转换为日期时,会生成随机日期
- xamarin - 我可以在 Xamarin 中使用控件模板之类的东西来包围新对象吗?
- c# - 通过 C# 7.x 语法添加,是否有“x ?? (x = MakeX())”版本,其中 x 是通过 out 参数分配的?
- java - 为什么 lambda 在抛出运行时异常时会更改重载?
- typescript - Typescript:通用类类型推断
- html - 如何防止chrome使用html css和js文件的缓存副本而不是angular 4中来自服务器的新构建数据