仅当通过XSL有条件地对XML进行分组/求和时,才输出所有元素而不是分组的元素

时间:2018-08-29 12:16:27

标签: xslt xslt-1.0 xslt-grouping

我需要对销售值和合并税值的记录进行汇总和汇总。发表在堆栈上: XSL 1.0 group by and sum SalesAmount and related / joined Tax records

多亏了Martin Honnen,我才有合适的xsl来做到这一点!

需求是:在xml上,我有4个发票行,且具有相同的itemid,我希望将其分组并加总lineamount,因此导致有1行具有itemid /总金额。对于同一xml中的税记录(通过ID连接到发票记录),我想要相同的输出。

问题是,我创建的xsl总是对发票和税款元素进行分组/求和,这是一个例外。例如,当itemid以一组特定的字符开头时(例如下面的示例中为400)。

我成功地有条件地进行了分组(starts-with(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个具有相同itemids的元素/元素,现在仅显示要显示8行(7个唯一+ 1个分组)的分组元素。

我希望我已经清楚了

0 个答案:

没有答案