我有输入
<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中存在至少一个毛值时,才需要毛值。如果没有毛,则不需要。
答案 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>