将两条记录连接到xslt中的单个记录

问题描述 投票:0回答:1

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>

response

  <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-2.0
1个回答
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'),或者您的真实数据是否需要,因为它包含该元素值的不同拼写。

© www.soinside.com 2019 - 2024. All rights reserved.