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