<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将增加迭代次数。 有没有更好的方法呢?任何帮助都是值得赞赏的。基本上每个独特的记录(从Amount到UD7)将有两个记录deffredAmount和outsBalance。需要使用defferedAmount和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')
,或者您的真实数据是否需要,因为它包含该元素值的不同拼写。