xslt 1.0中不同值的总和

时间:2012-04-14 17:13:51

标签: distinct xslt-1.0

<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>

我试图使用xslt1.0获取不同值的总和。  我希望使用muenchian方法这样的输出。这个账单将有多个产品。在一天结束时,我需要账单总数和总金额

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

感谢您的帮助 RAM

2 个答案:

答案 0 :(得分:0)

这个Xslt样式表:

<?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>

呈现以下输出:

<?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>

答案 1 :(得分:0)

这种简短而简单的转换(无xsl:for-each,无..,无text()用途:

<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>

应用于提供的XML文档时:

<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>

会产生确切的,正确的结果:

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

解释:正确使用

  1. Muenchian method for grouping

  2. sum()功能