Объединить две записи в одну запись в xslt - PullRequest
0 голосов
/ 13 сентября 2018

Запрос

<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) будет иметь две записи deffredAmount и outsBalance.Нужно объединить эти две записи с defferedAmount и outsBalance

1 Ответ

0 голосов
/ 14 сентября 2018

Как я уже предлагал в комментарии, это похоже на случай учебника для использования новой функции 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') из-за опечаток в ваших выборочных данных или в ваших реальных данных, потому что они содержат различные варианты написания значения этого элемента.

...