在 xslt 中将两条记录合并为一条记录



Request

<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 将增加迭代次数。
有没有更好的方法?任何帮助,不胜感激。基本上每个唯一的记录(从金额到UD7(将有两个记录deffredAmount和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')是否由于示例数据中的拼写错误而有必要,或者您的真实数据是否需要检查,因为它包含该元素值的不同拼写。

最新更新