添加总金额并将其添加到新标签中

时间:2017-01-02 10:55:29

标签: xslt xslt-1.0 xslt-2.0

我有输入

    <Invoice>
    <Invoice_Details>
    <Consolidated_Invoice_ID>1</Consolidated_Invoice_ID>
    <Line>1</Line>
    <Gross_Invoice_Amount>1110</Gross_Invoice_Amount>
    </Invoice_Details>
    <Invoice_Details>
    <Consolidated_Invoice_ID>1</Consolidated_Invoice_ID>
    <Line>2</Line>
    <Gross_Invoice_Amount>1110</Gross_Invoice_Amount>
    </Invoice_Details>
    <Invoice_Details>
    <Consolidated_Invoice_ID>2</Consolidated_Invoice_ID>
    <Line>1</Line>
    <Gross_Invoice_Amount>2220</Gross_Invoice_Amount>
    </Invoice_Details>
    <Invoice_Details>
    <Consolidated_Invoice_ID>2</Consolidated_Invoice_ID>
    <Line>2</Line>
    <Gross_Invoice_Amount>2220</Gross_Invoice_Amount>
    </Invoice_Details>
   </Invoice>

我想要格式的输出:

    <Invoice>
    <Invoice_Details>
    <Consolidated_Invoice_ID>1</Consolidated_Invoice_ID>
    <Line>1</Line>
    <Gross_Invoice_Amount>1110</Gross_Invoice_Amount>
    </Invoice_Details>
    <Invoice_Details>
    <Consolidated_Invoice_ID>1</Consolidated_Invoice_ID>
    <Line>2</Line>
    <Gross_Invoice_Amount>1110</Gross_Invoice_Amount>
    </Invoice_Details>
    <Invoice_Details>
    <Consolidated_Invoice_ID>1</Consolidated_Invoice_ID>
    <Line>3</Line>
    <Gross_Invoice_Amount>22220</Gross_Invoice_Amount>
    </Invoice_Details>
    <Invoice_Details>
    <Consolidated_Invoice_ID>2</Consolidated_Invoice_ID>
    <Line>1</Line>
    <Gross_Invoice_Amount>2220</Gross_Invoice_Amount>
    </Invoice_Details>
    <Invoice_Details>
    <Consolidated_Invoice_ID>2</Consolidated_Invoice_ID>
    <Line>2</Line>
    <Gross_Invoice_Amount>2220</Gross_Invoice_Amount>
    </Invoice_Details>
    <Invoice_Details>
    <Consolidated_Invoice_ID>2</Consolidated_Invoice_ID>
    <Line>3</Line>
    <Gross_Invoice_Amount>4440</Gross_Invoice_Amount>
    </Invoice_Details>
    </Invoice>

发票ID和行值的值将创建为添加所有相同ID总值的新元素。

条件: 只有当任何可用的ID中存在至少一个毛值时,才需要毛值。如果没有毛,则不需要。

1 个答案:

答案 0 :(得分:0)

这是一个XSLT 1.0解决方案:

    <?xml version="1.0" encoding="UTF-8" ?>
<xsl:transform xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="2.0">
    <xsl:output method="xml" doctype-public="XSLT-compat" omit-xml-declaration="yes" encoding="UTF-8" indent="yes" />

<xsl:key name="invoices" match="Invoice/Invoice_Details" use="Consolidated_Invoice_ID"/>
    <xsl:template match="/">
      <Invoice>
        <xsl:for-each select="Invoice/Invoice_Details[count(.|key('invoices',Consolidated_Invoice_ID)[1])=1]">
            <xsl:variable name="details" select="key('invoices',Consolidated_Invoice_ID)"/>
            <xsl:copy-of select="$details"/>
            <!--Add a new record with gross amount and total-->
            <Consolidated_Invoice_ID>
            <xsl:value-of select="Consolidated_Invoice_ID"/>
            </Consolidated_Invoice_ID>
            <Line>
            <xsl:value-of select="count($details)+1"/>
            </Line>
            <Gross_Invoice_Amount>
            <xsl:value-of select="sum($details/Gross_Invoice_Amount)"/>
            </Gross_Invoice_Amount>
        </xsl:for-each>
      </Invoice>
    </xsl:template>
</xsl:transform>