Вывод всех элементов вместо сгруппированных элементов только при условии условной группировки / суммирования xml через XSL - PullRequest
0 голосов
/ 29 августа 2018

У меня было требование группировать и суммировать записи как для продаж, так и для объединенных налоговых значений. Размещено в стеке: XSL 1.0 группировать и суммировать SalesAmount и связанные / объединенные налоговые записи

Благодаря Мартину Хоннену я получил право xsl сделать это!

Требование было: в xml у меня было 4 строки счета-фактуры с тем же идентификатором товара, который я хотел сгруппировать и суммировать количество строк, таким образом, получая в результате 1 строку с идентификатором товара / общей суммой. Для записей налога в том же xml, связанных идентификатором с записями счета-фактуры, я хотел получить тот же вывод.

Дело в том, что созданный мною xsl всегда группирует / суммирует накладные и налоговые элементы, где это скорее исключение. Например, когда itemid начинается с определенного набора символов (например, 400 в приведенном ниже примере).

Мне удалось условно выполнить группировку (начинается с (msxsl: ItemId), но я хочу, чтобы все остальные элементы в моем выводе были «как есть» (все элементы CustInvoiceJour, все остальные записи CustInvoiceTrans не сгруппированы, все другие записи TaxTrans не сгруппированы) , MarkupTransHeader, FormLetterRemarks и т. Д.)

Исходный XML:

<?xml version="1.0" encoding="UTF-8"?>
<Envelope xmlns="http://schemas.microsoft.com/dynamics/2008/01/documents/Message">
  <Header>
    <MessageId>{F18CC6D0A389}</MessageId>
    <SourceEndpoint>AAA</SourceEndpoint>
    <DestinationEndpoint>INVOICE</DestinationEndpoint>
    <Action>http://schemas.microsoft.com/dynamics/2008/01/services/SalesSalesInvoiceService/read</Action>
  </Header>
  <Body>
    <MessageParts xmlns="http://schemas.microsoft.com/dynamics/2008/01/documents/Message">
      <SalesInvoice xmlns="http://schemas.microsoft.com/dynamics/2008/01/documents/SalesInvoice">
        <CustInvoiceJour class="entity">
          <AccountcategoryId>AFAD</AccountcategoryId>
          <CreateDateTime>2018-07-27T16:03:01Z</CreateDateTime>
          <CurrencyCode>EUR</CurrencyCode>
          <CustInvoiceTrans class="entity">
            <DlvDate>2018-07-31</DlvDate>
            <ExtGtin>2907557321149</ExtGtin>
            <InventTransId>12515771_067</InventTransId>
            <InvoiceDate>2018-07-27</InvoiceDate>
            <ItemId>400100</ItemId>
            <ItemName>Main Item</ItemName>
            <LineAmount>101.86</LineAmount>
            <LineNum>1.0000000000</LineNum>
            <PriceUnit>1.00</PriceUnit>
            <Qty>1.00</Qty>
          </CustInvoiceTrans>
          <CustInvoiceTrans class="entity">
            <DlvDate>2018-07-31</DlvDate>
            <ExtGtin>2907557321149</ExtGtin>
            <InventTransId>12515772_067</InventTransId>
            <InvoiceDate>2018-07-27</InvoiceDate>
            <ItemId>400201</ItemId>
            <ItemName>Sub Item 1</ItemName>
            <LineAmount>29.50</LineAmount>
            <LineNum>2.0000000000</LineNum>
            <PriceUnit>1.00</PriceUnit>
            <Qty>1.00</Qty>
          </CustInvoiceTrans>
          <CustInvoiceTrans class="entity">
            <DlvDate>2018-07-31</DlvDate>
            <ExtGtin>2907557321149</ExtGtin>
            <InventTransId>12515773_067</InventTransId>
            <InvoiceDate>2018-07-27</InvoiceDate>
            <ItemId>400202</ItemId>
            <ItemName>Sub Item 2</ItemName>
            <LineAmount>31.20</LineAmount>
            <LineNum>3.0000000000</LineNum>
            <PriceUnit>1.00</PriceUnit>
            <Qty>1.00</Qty>
          </CustInvoiceTrans>
          <CustInvoiceTrans class="entity">
            <DlvDate>2018-07-31</DlvDate>
            <ExtGtin>2907557321149</ExtGtin>
            <InventTransId>12523411_067</InventTransId>
            <InvoiceDate>2018-07-27</InvoiceDate>
            <ItemId>400203</ItemId>
            <ItemName>Sub Item 3</ItemName>
        <LineAmount>10.00</LineAmount>
            <LineNum>4.0000000000</LineNum>
            <PriceUnit>1.00</PriceUnit>
            <Qty>1.00</Qty>
          </CustInvoiceTrans>
          <CustInvoiceTrans class="entity">
            <DlvDate>2018-07-31</DlvDate>
            <ExtGtin></ExtGtin>
            <InventTransId>12523412_067</InventTransId>
            <InvoiceDate>2018-07-27</InvoiceDate>
            <ItemId>666777</ItemId>
            <ItemName>Completely different item</ItemName>
        <LineAmount>100.00</LineAmount>
            <LineNum>5.0000000000</LineNum>
            <PriceUnit>1.00</PriceUnit>
            <Qty>1.00</Qty>
          </CustInvoiceTrans>
          <CustInvoiceTrans class="entity">
            <DlvDate>2018-07-31</DlvDate>
            <ExtGtin></ExtGtin>
            <InventTransId>12523413_067</InventTransId>
            <InvoiceDate>2018-07-27</InvoiceDate>
            <ItemId>666778</ItemId>
            <ItemName>Completely different item</ItemName>
        <LineAmount>200.00</LineAmount>
            <LineNum>6.0000000000</LineNum>
            <PriceUnit>1.00</PriceUnit>
            <Qty>1.00</Qty>
          </CustInvoiceTrans>
          <TaxTrans class="entity">
            <TaxAmount>-9.45</TaxAmount>
            <TaxBaseAmount>-45.00</TaxBaseAmount>
            <TaxValue>21.00</TaxValue>
          </TaxTrans>
          <TaxTrans class="entity">
            <InventTransId>12515771_067</InventTransId>
            <TaxAmount>-21.39</TaxAmount>
            <TaxBaseAmount>-101.86</TaxBaseAmount>
            <TaxValue>21.00</TaxValue>
          </TaxTrans>
          <TaxTrans class="entity">
            <InventTransId>12515772_067</InventTransId>
            <TaxAmount>-6.20</TaxAmount>
            <TaxBaseAmount>-29.50</TaxBaseAmount>
            <TaxValue>21.00</TaxValue>
          </TaxTrans>
          <TaxTrans class="entity">
            <InventTransId>12515773_067</InventTransId>
            <TaxAmount>-6.55</TaxAmount>
            <TaxBaseAmount>-31.20</TaxBaseAmount>
            <TaxValue>21.00</TaxValue>
          </TaxTrans>
          <TaxTrans class="entity">
            <InventTransId>12523411_067</InventTransId>
            <TaxAmount>-2.10</TaxAmount>
            <TaxBaseAmount>-10.00</TaxBaseAmount>
            <TaxValue>21.00</TaxValue>
          </TaxTrans>
          <TaxTrans class="entity">
            <InventTransId>12523412_067</InventTransId>
            <TaxAmount>-21.00</TaxAmount>
            <TaxBaseAmount>-100.00</TaxBaseAmount>
            <TaxValue>21.00</TaxValue>
          </TaxTrans>
          <TaxTrans class="entity">
            <InventTransId>12523413_067</InventTransId>
            <TaxAmount>-42.00</TaxAmount>
            <TaxBaseAmount>-200.00</TaxBaseAmount>
            <TaxValue>21.00</TaxValue>
          </TaxTrans>
          <MarkupTransHeader class="entity">
            <CalculatedAmount>45.00</CalculatedAmount>
            <ExemptTax>No</ExemptTax>
            <MarkupCategory>Fixed</MarkupCategory>
            <MarkupCode>HD</MarkupCode>
            <TaxValue>21.00</TaxValue>
          </MarkupTransHeader>
          <FormLetterRemarks class="entity">
            <LanguageId>nl-be</LanguageId>
          </FormLetterRemarks>
          <CompanyInfo class="entity">
            <LanguageId>NL</LanguageId>
          </CompanyInfo>
        </CustInvoiceJour>
      </SalesInvoice>
    </MessageParts>
  </Body>
</Envelope>

XSLT:

<?xml version="1.0" encoding="utf-8"?>
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns:msxsl="http://schemas.microsoft.com/dynamics/2008/01/documents/SalesInvoice">

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

  <!-- Geen lege regels in xml indien elementen niet worden meegenomen van input naar output-->
  <xsl:strip-space elements="*" />

  <xsl:template match="*" mode="copy-no-namespaces">
    <xsl:element name="{local-name()}">
      <xsl:copy-of select="@*"/>
      <xsl:apply-templates select="node()" mode="copy-no-namespaces"/>
    </xsl:element>
  </xsl:template>

  <xsl:template match="comment()| processing-instruction()" mode="copy-no-namespaces">
    <xsl:copy/>
  </xsl:template>

  <xsl:key name="CustInvoiceTransKey" match="msxsl:CustInvoiceJour/msxsl:CustInvoiceTrans[starts-with(msxsl:ItemId, '400')]" use="msxsl:ExtGtin"/>
  <xsl:key name="RefTaxTransKey" match="msxsl:CustInvoiceJour/msxsl:TaxTrans" use="msxsl:InventTransId"/>

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

  <xsl:template match="msxsl:CustInvoiceJour">
    <xsl:copy>
      <xsl:apply-templates select="@*"/> 
      <!---  <xsl:apply-templates select="@*|node()" /> -->
      <xsl:variable name="group-heads"
            select="msxsl:CustInvoiceTrans[generate-id() = generate-id(key('CustInvoiceTransKey', msxsl:ExtGtin)[1])]"/>
      <xsl:apply-templates select="$group-heads"/>
      <xsl:apply-templates select="$group-heads" mode="tax"/>
      <!--- <xsl:value-of select="$group-heads" /> -->
    </xsl:copy>
  </xsl:template>

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

  <xsl:template match="msxsl:CustInvoiceJour/msxsl:CustInvoiceTrans" mode="tax">
    <xsl:element name="TraxTrans" namespace="{namespace-uri()}">
      <xsl:attribute name="class">entity</xsl:attribute>
      <xsl:variable name="referenced-tax" select="key('RefTaxTransKey', key('CustInvoiceTransKey', msxsl:ExtGtin)/msxsl:InventTransId)"/>
      <xsl:apply-templates select="$referenced-tax[1]/msxsl:InventTransId" mode="copy-no-namespaces"/>
      <xsl:element name="TaxAmount" namespace="{namespace-uri()}">
        <xsl:value-of select="sum($referenced-tax/msxsl:TaxAmount)"/>
      </xsl:element>
      <xsl:element name="TaxBaseAmount" namespace="{namespace-uri()}">
        <xsl:value-of select="sum($referenced-tax/msxsl:TaxBaseAmount)"/>
      </xsl:element>
      <xsl:apply-templates select="$referenced-tax[1]/msxsl:TaxValue"  mode="copy-no-namespaces"/>
    </xsl:element>
  </xsl:template>


</xsl:stylesheet>

Результат XML:

<?xml version="1.0" encoding="utf-8"?>
<Envelope xmlns="http://schemas.microsoft.com/dynamics/2008/01/documents/Message">
  <Header>
    <MessageId>{F18CC6D0A389}</MessageId>
    <SourceEndpoint>AAA</SourceEndpoint>
    <DestinationEndpoint>INVOICE</DestinationEndpoint>

    <Action>http://schemas.microsoft.com/dynamics/2008/01/services/SalesSalesInvoiceService/read</Action>
  </Header>
  <Body>
    <MessageParts>
      <SalesInvoice xmlns="http://schemas.microsoft.com/dynamics/2008/01/documents/SalesInvoice">
        <CustInvoiceJour class="entity">
          <CustInvoiceTrans class="entity">
            <DlvDate>2018-07-31</DlvDate>
            <ExtGtin>2907557321149</ExtGtin>
            <InventTransId>12515771_067</InventTransId>
            <InvoiceDate>2018-07-27</InvoiceDate>
            <ItemId>400100</ItemId>
            <ItemName>Main Item</ItemName>
            <LineAmount>172.56</LineAmount>
            <LineNum>1.0000000000</LineNum>
            <PriceUnit>1.00</PriceUnit>
            <Qty>1.00</Qty>
          </CustInvoiceTrans>
          <TraxTrans class="entity">
            <InventTransId xmlns="">12515771_067</InventTransId>
            <TaxAmount>-36.24</TaxAmount>
            <TaxBaseAmount>-172.56</TaxBaseAmount>
            <TaxValue xmlns="">21.00</TaxValue>
          </TraxTrans>
        </CustInvoiceJour>
      </SalesInvoice>
    </MessageParts>
  </Body>
</Envelope>

Обязательный XML

<?xml version="1.0" encoding="utf-8"?>
<Envelope xmlns="http://schemas.microsoft.com/dynamics/2008/01/documents/Message">
  <Header>
    <MessageId>{F18CC6D0A389}</MessageId>
    <SourceEndpoint>AAA</SourceEndpoint>
    <DestinationEndpoint>INVOICE</DestinationEndpoint>
    <Action>http://schemas.microsoft.com/dynamics/2008/01/services/SalesSalesInvoiceService/read</Action>
  </Header>
  <Body>
    <MessageParts>
      <SalesInvoice xmlns="http://schemas.microsoft.com/dynamics/2008/01/documents/SalesInvoice">
        <CustInvoiceJour class="entity">
          <AccountcategoryId>AFAD</AccountcategoryId>
          <CreateDateTime>2018-07-27T16:03:01Z</CreateDateTime>
          <CurrencyCode>EUR</CurrencyCode>
          <CustInvoiceTrans class="entity">
            <DlvDate>2018-07-31</DlvDate>
            <ExtGtin>2907557321149</ExtGtin>
            <InventTransId>12515771_067</InventTransId>
            <InvoiceDate>2018-07-27</InvoiceDate>
            <ItemId>400100</ItemId>
            <ItemName>Main Item</ItemName>
            <LineAmount>172.56</LineAmount>
            <LineNum>1.0000000000</LineNum>
            <PriceUnit>1.00</PriceUnit>
            <Qty>1.00</Qty>
          </CustInvoiceTrans>
          <CustInvoiceTrans class="entity">
            <DlvDate>2018-07-31</DlvDate>
            <ExtGtin></ExtGtin>
            <InventTransId>12523412_067</InventTransId>
            <InvoiceDate>2018-07-27</InvoiceDate>
            <ItemId>666777</ItemId>
            <ItemName>Completely different item</ItemName>
            <LineAmount>100.00</LineAmount>
            <LineNum>5.0000000000</LineNum>
            <PriceUnit>1.00</PriceUnit>
            <Qty>1.00</Qty>
          </CustInvoiceTrans>
          <CustInvoiceTrans class="entity">
            <DlvDate>2018-07-31</DlvDate>
            <ExtGtin></ExtGtin>
            <InventTransId>12523413_067</InventTransId>
            <InvoiceDate>2018-07-27</InvoiceDate>
            <ItemId>666778</ItemId>
            <ItemName>Completely different item</ItemName>
            <LineAmount>200.00</LineAmount>
            <LineNum>6.0000000000</LineNum>
            <PriceUnit>1.00</PriceUnit>
            <Qty>1.00</Qty>
          </CustInvoiceTrans>
          <TraxTrans class="entity">
            <InventTransId xmlns="">12515771_067</InventTransId>
            <TaxAmount>-36.24</TaxAmount>
            <TaxBaseAmount>-172.56</TaxBaseAmount>
            <TaxValue xmlns="">21.00</TaxValue>
          </TraxTrans>
          <TaxTrans class="entity">
            <InventTransId>12523412_067</InventTransId>
            <TaxAmount>-21.00</TaxAmount>
            <TaxBaseAmount>-100.00</TaxBaseAmount>
            <TaxValue>21.00</TaxValue>
          </TaxTrans>
          <TaxTrans class="entity">
            <InventTransId>12523413_067</InventTransId>
            <TaxAmount>-42.00</TaxAmount>
            <TaxBaseAmount>-200.00</TaxBaseAmount>
            <TaxValue>21.00</TaxValue>
          </TaxTrans>
        </CustInvoiceJour>
      </SalesInvoice>
    </MessageParts>
  </Body>
</Envelope>

Небольшое резюме: XML с напр. 10 строк, для которых я хочу условно сгруппировать / сумму (продажи / налог) 3 строки / элементы с одинаковыми позициями, теперь отображаются только сгруппированные элементы, где я хочу показать 8 строк (7 уникальных + 1 сгруппированных).

Надеюсь, я ясно дал понять

...