xslt1.0 中非重复值的总和

  • 本文关键字:xslt1 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>

感谢您的帮助公羊

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

这个简短而简单的转换(没有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. 明基安的分组方法

  2. sum()函数

相关内容

  • 没有找到相关文章

最新更新