2012-10-29 17 views
0

我有一個生成事務文件的XML,它記錄了從會員卡花費多少錢以及完成日期的條目。沒有我可以使用的訂單,因爲在XML中可能會出現相同的卡號。我想要的是讓XSL找到一個卡號(我沒有用作ID的記錄),把它放在<td></td>中,並顯示總共花了多少錢,賺了多少分,它是什麼日期完成的。分組,排序,在沒有訂單的XML中求和

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

...我已經尋找例子,但無法找到具備所有這些條件的情況當放到單個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> 
+0

您好!是否有可能展示您的預期產出?我不是100%你的分組標準是什麼(即你想要所有日期的總數,還是按日期分組)。特別是你的XML有不同的卡號,或者只有一個?謝謝! –

+0

Hi @Tim C,輸出文件已包含在上面。幸運的是,XML只有一個日期,所以日期字段沒問題。難度在於每次輸入卡號時,都會將其使用的總次數分組,然後總計總分和總花費。所以我希望每張卡的積分和金錢都用作單個條目,目前它會輸出每一個條目並且頁面太長。也有不同的卡片使用,我不知道它們是什麼,直到它們出現在XML中。謝謝 –

回答

0

如果你想總每張卡的積分,花,然後你會被他們的卡號需要組牌。在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(請注意,我已經簡化它來刪除所有的造型)

完成
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"> 
    <xsl:output method="html"/> 
    <xsl:key name="cards" match="ClubcardPoints" use="@CardNo"/> 

    <xsl:template match="/"> 
     <table> 
     <THEAD> 
      <TR> 
       <TD>Account Number</TD> 
       <TD>Points</TD> 
       <TD>Date</TD> 
       <TD>Qualified Spent</TD> 
      </TR> 
     </THEAD> 
     <TBODY> 
      <xsl:apply-templates select="Root/Ticket/ClubcardPoints[generate-id() = generate-id(key('cards', @CardNo)[1])]"/> 
     </TBODY> 
     </table> 
    </xsl:template> 

    <xsl:template match="ClubcardPoints"> 
     <TR> 
     <TD> 
      <xsl:value-of select="@CardNo"/> 
     </TD> 
     <TD> 
      <xsl:value-of select="sum(key('cards', @CardNo)/@Points)"/> 
     </TD> 
     <TD> 
      <xsl:value-of select="@Date"/> 
     </TD> 
     <TD> 
      <xsl:value-of select="format-number(sum(key('cards', @CardNo)/@QualSpend) div 100,'R#.##')"/> 
     </TD> 
     </TR> 
    </xsl:template> 
</xsl:stylesheet> 

當施加到示例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> 

請注意,在XSLT2.0中,將通過使用xsl:for each each group元素來完成分組。

+0

親愛的@Tim C,感謝您的建議,我會嘗試在我身邊並報告回來。我確實嘗試了xsl:for-each-group,但不知道它是否適用於XSLT2.0。謝謝 –

+0

親愛的@Tim C.您的建議完美解決。非常感謝。 –