首页 > 解决方案 > 在 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-2.0

解决方案


正如我已经在评论中建议的那样,这似乎是一个使用新 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')由于示例数据中的拼写错误而需要进行检查,或者您的真实数据是否需要检查,因为它包含该元素值的不同拼写。


推荐阅读