2012-04-14 6 views
1
<customer> 
    <item> 
    <BILLNO>1</BILLNO> 
    <product>ABC</product> 
    <AMT>20</AMT> 
    </item> 
    <item> 
    <BILLNO>2</BILLNO> 
    <product>GHK</product> 
    <AMT>30</AMT> 
    </item> 
    <item> 
    <BILLNO>1</BILLNO> 
    <product>XYZ</product> 
    <AMT>20</AMT> 
    </item> 
</customer> 

Ich versuche die Summe der verschiedenen Werte mit xslt1.0 zu nehmen. Ich möchte die Ausgabe wie folgt mit muenchian method.each Rechnung wird mehrere Produkte haben. am Ende des Tages muss ich Gesamtzahl der Rechnungen und die GesamtmengeGroßartige Summe verschiedener Werte in xslt1.0

<sales> 
    <totalbills>2</totalbills> 
    <totalamount>50</totalamount> 
</sales> 

Vielen Dank für Hilfe ram

Antwort

0

Dieses XSLT-Stylesheet:

<?xml version="1.0" encoding="utf-8"?> 
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform" 
    xmlns:msxsl="urn:schemas-microsoft-com:xslt" exclude-result-prefixes="msxsl"> 
    <xsl:output method="xml" indent="yes"/> 

    <xsl:key name="item-key" match="item" use="BILLNO/text()"/> 

    <xsl:template match="/customer"> 
    <root> 
     <xsl:for-each select="item[generate-id() = generate-id(key('item-key', BILLNO/text()))]"> 
     <sales> 
      <totalbills> 
      <xsl:value-of select="count(../item[BILLNO = current()/BILLNO])"/> 
      </totalbills> 
      <totalamount> 
      <xsl:value-of select="sum(../item[BILLNO = current()/BILLNO]/AMT)"/> 
      </totalamount> 
     </sales> 
     </xsl:for-each> 
    </root> 
    </xsl:template> 
</xsl:stylesheet> 

macht die folgende ouptut:

<?xml version="1.0" encoding="utf-8"?> 
<root> 
    <sales> 
    <totalbills>2</totalbills> 
    <totalamount>40</totalamount> 
    </sales> 
    <sales> 
    <totalbills>1</totalbills> 
    <totalamount>30</totalamount> 
    </sales> 
</root> 
0

Dieser kurze und einfachere Transfor mation (keine xsl:for-each, keine .., keine text() useage):

<xsl:stylesheet version="1.0" 
xmlns:xsl="http://www.w3.org/1999/XSL/Transform"> 
<xsl:output omit-xml-declaration="yes" indent="yes"/> 

<xsl:key name="kBills" match="item" use="BILLNO"/> 

<xsl:variable name="vdistItems" select= 
    "/*/*[generate-id() = generate-id(key('kBills', BILLNO)[1])]"/> 

<xsl:template match="/*"> 
    <sales> 
     <totalbills><xsl:value-of select="count($vdistItems)"/></totalbills> 
     <totalamount><xsl:value-of select="sum($vdistItems/AMT)"/></totalamount> 
    </sales> 
</xsl:template> 
</xsl:stylesheet> 

wenn auf dem mitgelieferten XML-Dokument angewandt:

<customer> 
    <item> 
    <BILLNO>1</BILLNO> 
    <product>ABC</product> 
    <AMT>20</AMT> 
    </item> 
    <item> 
    <BILLNO>2</BILLNO> 
    <product>GHK</product> 
    <AMT>30</AMT> 
    </item> 
    <item> 
    <BILLNO>1</BILLNO> 
    <product>XYZ</product> 
    <AMT>20</AMT> 
    </item> 
</customer> 

produziert das wollte genaue, korrektes Ergebnis:

<sales> 
    <totalbills>2</totalbills> 
    <totalamount>50</totalamount> 
</sales> 

Erläuterung: Geeigneter Einsatz von

  1. Die Muenchian method for grouping.

  2. Die sum() Funktion.