У меня было требование группировать и суммировать записи как для продаж, так и для объединенных налоговых значений. Размещено в стеке:
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 сгруппированных).
Надеюсь, я ясно дал понять