Вы можете сгруппировать элементы 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