XSL 1.0 группировать и суммировать SalesAmount и связанные / объединенные налоговые записи - PullRequest
0 голосов
/ 28 августа 2018

У меня есть счет-фактура xml, где мне нужно выполнить группировку / сумму по itemid Например, для ItemId 444 мне нужно количество строк: 100 + 25 = 125 и ItemId 555 = 200 + 15. Существует множество примеров того, как это сделать, вы собираетесь сказать, но у меня есть другое требование. Мне также нужно выполнить ту же группировку и сумму для моих TaxTrans \ TaxAmounts и TaxTrans \ TaxBaseAmounts на основе присоединения поля InventTransId (AABB / BBCC) между CustInvoiceTrans и TaxTrans.

До:

  <CustInvoiceJour class="entity">
          <CustInvoiceTrans class="entity">
            <InventTransId>AABB</InventTransId>
            <InvoiceId>SI100</InvoiceId>
            <ItemId>444</ItemId>
            <LineAmount>100</LineAmount>
          </CustInvoiceTrans>
          <CustInvoiceTrans class="entity">
            <InventTransId>BBCC</InventTransId>
            <InvoiceId>SI100</InvoiceId>
            <ItemId>444</ItemId>
            <LineAmount>25</LineAmount>
          </CustInvoiceTrans>
          <CustInvoiceTrans class="entity">
            <InventTransId>CCDD</InventTransId>
            <InvoiceId>SI100</InvoiceId>
            <ItemId>555</ItemId>
            <LineAmount>200</LineAmount>
          </CustInvoiceTrans>
          <CustInvoiceTrans class="entity">
            <InventTransId>DDEE</InventTransId>
            <InvoiceId>SI100</InvoiceId>
            <ItemId>555</ItemId>
            <LineAmount>15</LineAmount>
          </CustInvoiceTrans>         
          <CustInvoiceTrans class="entity">
            <InventTransId>EEFF</InventTransId>
            <InvoiceId>SI100</InvoiceId>
            <ItemId>12345</ItemId>
            <LineAmount>40</LineAmount>
          </CustInvoiceTrans>
          <TaxTrans class="entity">
            <InventTransId>AABB</InventTransId>
            <TaxAmount>-21</TaxAmount>
            <TaxBaseAmount>-100</TaxBaseAmount>
            <TaxValue>21.00</TaxValue>
          </TaxTrans>
          <TaxTrans class="entity">
            <InventTransId>BBCC</InventTransId>
            <TaxAmount>-5.25</TaxAmount>
            <TaxBaseAmount>-25</TaxBaseAmount>
            <TaxValue>21.00</TaxValue>
          </TaxTrans>
          <TaxTrans class="entity">
            <InventTransId>CCDD</InventTransId>
            <TaxAmount>-42</TaxAmount>
            <TaxBaseAmount>-200</TaxBaseAmount>
            <TaxValue>21.00</TaxValue>
          </TaxTrans>
          <TaxTrans class="entity">
            <InventTransId>DDEE</InventTransId>
            <TaxAmount>-3.15</TaxAmount>
            <TaxBaseAmount>-15</TaxBaseAmount>
            <TaxValue>15</TaxValue>
          </TaxTrans>
          <TaxTrans class="entity">
            <InventTransId>EEFF</InventTransId>
            <TaxAmount>-8.40</TaxAmount>
            <TaxBaseAmount>-40</TaxBaseAmount>
            <TaxValue>15</TaxValue>
          </TaxTrans>         
</CustInvoiceJour>

Требуемый вывод:

<CustInvoiceJour class="entity">
    <CustInvoiceTrans class="entity">
        <InventTransId>AABB</InventTransId>
        <InvoiceId>SI100</InvoiceId>
        <ItemId>444</ItemId>
        <LineAmount>125</LineAmount>
    </CustInvoiceTrans>
    <CustInvoiceTrans class="entity">
        <InventTransId>CCDD</InventTransId>
        <InvoiceId>SI100</InvoiceId>
        <ItemId>555</ItemId>
        <LineAmount>215</LineAmount>
    </CustInvoiceTrans>
    <CustInvoiceTrans class="entity">
        <InventTransId>EEFF</InventTransId>
        <InvoiceId>SI100</InvoiceId>
        <ItemId>12345</ItemId>
        <LineAmount>40</LineAmount>
    </CustInvoiceTrans>
    <TaxTrans class="entity">
        <InventTransId>AABB</InventTransId>
        <TaxAmount>-26.25</TaxAmount>
        <TaxBaseAmount>-125</TaxBaseAmount>
        <TaxValue>21.00</TaxValue>
    </TaxTrans>
    <TaxTrans class="entity">
        <InventTransId>CCDD</InventTransId>
        <TaxAmount>-45.15</TaxAmount>
        <TaxBaseAmount>-215</TaxBaseAmount>
        <TaxValue>21.00</TaxValue>
    </TaxTrans>
    <TaxTrans class="entity">
        <InventTransId>EEFF</InventTransId>
        <TaxAmount>-8.40</TaxAmount>
        <TaxBaseAmount>-40</TaxBaseAmount>
        <TaxValue>15</TaxValue>
    </TaxTrans>       
</CustInvoiceJour>

Я не знаю, возможно ли это вообще. Не говоря уже о том, с чего начать?

Mike

1 Ответ

0 голосов
/ 29 августа 2018

Вы можете сгруппировать элементы CustInvoiceTrans дважды, один раз, чтобы сгруппировать и суммировать их компоненты, второй раз, чтобы создать сумму ссылочных элементов TaxTrans, которые вы просто находите с помощью ключа <xsl:key name="RefTaxTrans" match="TaxTrans" use="InventTransId"/>; ниже показано, как создать сгруппированный TaxTrans и вычислить сумму для TaxAmount, вам просто нужно скопировать другие элементы, соответственно суммировать другой элемент внутри этого шаблона и элемент результата TaxTrans:

<xsl:stylesheet
    xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
    version="1.0">

  <xsl:output method="xml" indent="yes" />

  <xsl:key name="CustInvoiceTrans" match="CustInvoiceTrans" use="ItemId"/>
  <xsl:key name="RefTaxTrans" match="TaxTrans" use="InventTransId"/>

  <xsl:template match="@* | node()">
    <xsl:copy>
      <xsl:apply-templates select="@* | node()"/>
    </xsl:copy>
  </xsl:template>

  <xsl:template match="CustInvoiceJour">
      <xsl:copy>
          <xsl:apply-templates select="@*"/>
          <xsl:apply-templates select="CustInvoiceTrans[generate-id() = generate-id(key('CustInvoiceTrans', ItemId)[1])]" mode="tax"/>
      </xsl:copy>
  </xsl:template>

  <xsl:template match="CustInvoiceTrans" mode="tax">
      <TaxTrans>
          <xsl:variable name="referenced-tax" select="key('RefTaxTrans', key('CustInvoiceTrans', ItemId)/InventTransId)"/>
          <TaxAmount>
              <xsl:value-of select="sum($referenced-tax/TaxAmount)"/>
          </TaxAmount>
      </TaxTrans>
  </xsl:template>

</xsl:stylesheet>

https://xsltfiddle.liberty -development.net / jyH9rMG

Затем можно добавить обычную группировку для элементов CustInvoiceTrans с помощью другого apply-templates в режиме по умолчанию перед строкой <xsl:apply-templates select="CustInvoiceTrans[generate-id() = generate-id(key('CustInvoiceTrans', ItemId)[1])]" mode="tax"/>. Или может быть проще сохранить первый элемент каждой группы, а затем дважды применить шаблоны, один раз в режиме по умолчанию, без имени, второй раз в режиме для указанных элементов:

<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet
    xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
    version="1.0">

  <xsl:output method="xml" indent="yes" />
  <xsl:strip-space elements="*"/>

  <xsl:key name="CustInvoiceTrans" match="CustInvoiceTrans" use="ItemId"/>
  <xsl:key name="RefTaxTrans" match="TaxTrans" use="InventTransId"/>

  <xsl:template match="@* | node()">
    <xsl:copy>
      <xsl:apply-templates select="@* | node()"/>
    </xsl:copy>
  </xsl:template>

  <xsl:template match="CustInvoiceJour">
      <xsl:copy>
          <xsl:apply-templates select="@*"/>
          <xsl:variable name="group-heads"
             select="CustInvoiceTrans[generate-id() = generate-id(key('CustInvoiceTrans', ItemId)[1])]"/>
          <xsl:apply-templates select="$group-heads"/>
          <xsl:apply-templates select="$group-heads" mode="tax"/>
      </xsl:copy>
  </xsl:template>

  <xsl:template match="CustInvoiceTrans/LineAmount">
      <xsl:copy>
          <xsl:value-of select="sum(key('CustInvoiceTrans', ../ItemId)/LineAmount)"/>
      </xsl:copy>
  </xsl:template>

  <xsl:template match="CustInvoiceTrans" mode="tax">
      <TaxTrans class="entity">
          <xsl:variable name="referenced-tax" select="key('RefTaxTrans', key('CustInvoiceTrans', ItemId)/InventTransId)"/>
          <xsl:copy-of select="$referenced-tax[1]/InventTransId"/>
          <TaxAmount>
              <xsl:value-of select="sum($referenced-tax/TaxAmount)"/>
          </TaxAmount>
          <TaxBaseAmount>
              <xsl:value-of select="sum($referenced-tax/TaxBaseAmount)"/>
          </TaxBaseAmount>
          <xsl:copy-of select="$referenced-tax[1]/TaxValue"/>
      </TaxTrans>
  </xsl:template>

</xsl:stylesheet>

https://xsltfiddle.liberty -development.net / jyH9rMG / 1

...