Html 在没有顺序的XML中进行分组、排序和求和

Html 在没有顺序的XML中进行分组、排序和求和,html,xml,xslt,Html,Xml,Xslt,我有一个生成事务文件的XML,它记录了俱乐部卡上的条目,记录了为获得积分花费了多少钱以及完成日期。由于相同的卡号可能会进一步出现在XML中,因此我无法使用任何顺序。我想要的是让XSL找到一个卡号(我没有可以用作ID的卡号记录),将其放入中,并显示总共花费了多少钱,获得了多少积分以及完成的日期 这是XML <Root> <Events> <TicketEnd Date="2012-10-21" /> </Events> <T

我有一个生成事务文件的XML,它记录了俱乐部卡上的条目,记录了为获得积分花费了多少钱以及完成日期。由于相同的卡号可能会进一步出现在XML中,因此我无法使用任何顺序。我想要的是让XSL找到一个卡号(我没有可以用作ID的卡号记录),将其放入
中,并显示总共花费了多少钱,获得了多少积分以及完成的日期

这是XML

<Root>
  <Events>
    <TicketEnd Date="2012-10-21" />
  </Events>
  <Ticket>
    <TicketStart Date="2012-10-22" />
    <TicketEnd Date="2012-10-22" />
  </Ticket>
  <Events>
  </Events>
  <Ticket>
    <TicketStart Date="2012-10-22" />
    <Clubcard Opcode="96" Function="27" CardAcc="1" QualSpendInfo="0" SchemeNo="40" CardNo="1042540000026" PointsToDate="0" RedemptionValue="0" CustomerUpdateDate="000000" QualSpent="0" Date="2012-10-22" />
    <ClubcardPoints Opcode="96" Function="28" SchemeNo="40" PromNo="0" CardNo="1042540000026" QualSpend="30005" PointSpend="0" Points="6" BonusPoints="0" PromCount="0" Date="2012-10-22" />
    <Clubcard Opcode="96" Function="27" CardAcc="1" QualSpendInfo="1" SchemeNo="40" CardNo="1042540000026" PointsToDate="0" RedemptionValue="0" CustomerUpdateDate="000000" QualSpent="30005" Date="2012-10-22" />
    <TicketEnd Date="2012-10-22" />
  </Ticket>
  <Ticket>
    <TicketStart Date="2012-10-22" />
    <Clubcard Opcode="96" Function="27" CardAcc="1" QualSpendInfo="0" SchemeNo="40" CardNo="1042540000019" PointsToDate="0" RedemptionValue="0" CustomerUpdateDate="000000" QualSpent="0" Date="2012-10-22" />
    <ClubcardPoints Opcode="96" Function="28" SchemeNo="40" PromNo="0" CardNo="1042540000019" QualSpend="24330" PointSpend="0" Points="4" BonusPoints="0" PromCount="0" Date="2012-10-22" />
    <Clubcard Opcode="96" Function="27" CardAcc="1" QualSpendInfo="1" SchemeNo="40" CardNo="1042540000019" PointsToDate="0" RedemptionValue="0" CustomerUpdateDate="000000" QualSpent="24330" Date="2012-10-22" />
    <TicketEnd Date="2012-10-22" />
  </Ticket>
  <Ticket>
    <TicketStart Date="2012-10-22" />
    <Clubcard Opcode="96" Function="27" CardAcc="1" QualSpendInfo="0" SchemeNo="40" CardNo="1042540000026" PointsToDate="0" RedemptionValue="0" CustomerUpdateDate="000000" QualSpent="0" Date="2012-10-22" />
    <ClubcardPoints Opcode="96" Function="28" SchemeNo="40" PromNo="0" CardNo="1042540000026" QualSpend="30005" PointSpend="0" Points="6" BonusPoints="0" PromCount="0" Date="2012-10-22" />
    <Clubcard Opcode="96" Function="27" CardAcc="1" QualSpendInfo="1" SchemeNo="40" CardNo="1042540000026" PointsToDate="0" RedemptionValue="0" CustomerUpdateDate="000000" QualSpent="30005" Date="2012-10-22" />
    <TicketEnd Date="2012-10-22" />
  </Ticket>
</Root>

我的XSL只能列出条目

<?xml version="1.0"?>
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
  <xsl:output method="html"/>
  <xsl:template match="/">
    <html>
      <head>
    <title>Loyalty Sales</title>
      </head>
    <body>
      <br/>
      <br/>
      <br/>
       <h1 style="color:blue;
                  margin-left:20px;
                  font-family:verdana;
                  text-align:center;">
        Customers Report</h1>
      <br/>
      <p style="color:red;
                margin-left:20px;
                font-family:arial;
                text-align:right;
                font-size:15px;">
        Store Report</p>
      <p style="color:green;
                margin-left:20px;
                font-family:arial;
                text-align:right;
                font-size:15px;">
        for Customer ABC</p>
      <br/>
    <table width="100%" border="3">
      <THEAD>
      <TR bgcolor="RGB(0, 204, 51)">
      <TD width="25%">
        <font color="white"><B>Account Number</B></font>
      </TD>
      <TD width="25%">
        <font color="white"><B>Points</B></font>
      </TD>
      <TD width="25%">
        <font color="white"><B>Date</B></font>
      </TD>
      <TD width="25%">
        <font color="white"><B>Qualified Spent</B></font>
      </TD>
      </TR>
      </THEAD>
    <TBODY>
    <xsl:for-each select="Root/Ticket/ClubcardPoints">
      <TR>
      <TD width="25%"><xsl:value-of select="@CardNo" /></TD>
      <TD width="25%"><xsl:value-of select="@Points" /></TD>
      <TD width="25%"><xsl:value-of select="@Date" /></TD>
      <TD width="25%"><xsl:value-of select="format-number(@QualSpend div 100,'&#x52;#.##')" /></TD>
    </TR>
    </xsl:for-each>
    </TBODY>
    </table>
  </body>
</html>
</xsl:template>
</xsl:stylesheet>

忠诚销售



客户报告

存储报告

客户ABC


帐号 要点 日期 合格的花费
我已经搜索了一些示例,但找不到一个具有所有这些条件的场景,当将其放在一个XSL中时,它会失败。 请帮忙

这是我想要的输出文件

<THEAD>
                <TR bgcolor="RGB(0, 204, 51)">
                    <TD width="25%"><font color="white"><B>Account Number</B></font></TD>
                    <TD width="25%"><font color="white"><B>Total Points</B></font></TD>
                    <TD width="25%"><font color="white"><B>Date</B></font></TD>
                    <TD width="25%"><font color="white"><B>Total Qualified Spent</B></font></TD>
                </TR>
            </THEAD>
            <TBODY>
                <TR>
                    <TD width="25%">1042540000002</TD>
                    <TD width="25%">100</TD>
                    <TD width="25%">2012-10-22</TD>
                    <TD width="25%">R750.32</TD>
                </TR>

帐号
总分
日期
合格支出总额
1042540000002
100
2012-10-22
R750.32

如果您想合计每张卡的积分和消费,则需要根据卡的卡号对卡进行分组。在XSLT1.0中,可以使用Munechian分组来实现这一点。这意味着为您的组定义一个密钥

<xsl:key name="cards" match="ClubcardPoints" use="@CardNo" />

然后,要选择每个不同的卡号,您需要查找组中首先出现的ClubcardPoints。这是按如下方式进行的

<xsl:apply-templates 
   select="Root/Ticket/ClubcardPoints[generate-id() = generate-id(key('cards', @CardNo)[1])]" />

获得总分是很简单的

<xsl:value-of select="sum(key('cards', @CardNo)/@Points)" />

这是完整的XSLT(请注意,我已将其简化为删除所有样式)


帐号
要点
日期
合格的花费
当应用于示例XML时,将输出以下内容

<table>
   <THEAD>
      <TR>
         <TD>Account Number</TD>
         <TD>Points</TD>
         <TD>Date</TD>
         <TD>Qualified Spent</TD>
      </TR>
   </THEAD>
   <TBODY>
      <TR>
         <TD>1042540000026</TD>
         <TD>12</TD>
         <TD>2012-10-22</TD>
         <TD>R600.1</TD>
      </TR>
      <TR>
         <TD>1042540000019</TD>
         <TD>4</TD>
         <TD>2012-10-22</TD>
         <TD>R243.3</TD>
      </TR>
   </TBODY>
</table>

帐号
要点
日期
合格的花费
1042540000026
12
2012-10-22
R600.1
1042540000019
4.
2012-10-22
R243.3

请注意,在XSLT2.0中,可以使用xsl:for each group元素进行分组。

Hello!是否可以显示您的预期输出?我不是100%了解您的分组标准(即,您是希望所有日期的总数,还是按日期分组)。特别是您的XML中会有不同的卡号,还是只有一个?谢谢Hi@Tim C,输出文件已包含在上面。幸运的是,XML只有一个日期,因此日期字段很好。困难在于每次输入卡号时都要找出,将使用卡号的总次数分组,然后总结总分和总花费。所以我想把每张卡的积分和花费的钱的总数作为一个条目,目前它输出每个条目,页面太长。此外,还使用了不同的卡片,在它们出现在XML中之前,我不知道它们是什么。谢谢亲爱的@Tim C,谢谢你的建议,我将在我这方面尝试一下,并向你汇报。我确实为每个组尝试了xsl:for,但不知道XSLT2.0的用法。谢谢你亲爱的Tim C.你的建议非常有效。非常感谢你。
<table>
   <THEAD>
      <TR>
         <TD>Account Number</TD>
         <TD>Points</TD>
         <TD>Date</TD>
         <TD>Qualified Spent</TD>
      </TR>
   </THEAD>
   <TBODY>
      <TR>
         <TD>1042540000026</TD>
         <TD>12</TD>
         <TD>2012-10-22</TD>
         <TD>R600.1</TD>
      </TR>
      <TR>
         <TD>1042540000019</TD>
         <TD>4</TD>
         <TD>2012-10-22</TD>
         <TD>R243.3</TD>
      </TR>
   </TBODY>
</table>