0

私はトランザクション ファイルを生成する XML を持っています。これは、Clubcard から、ポイントを獲得するために費やした金額と日付を記録します。同じカード番号が XML でさらに表示される可能性があるため、使用できる順序はありません。私が望むのは、XSL にカード番号 (ID として使用する記録がありません) を見つけてもらい、それを に入れ<td></td>、合計でいくら使ったか、獲得したポイント数と何を表示することです。それが行われた日付。

これは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>
4

1 に答える 1

0

各カードのポイントと支出を合計したい場合は、カード番号でカードをグループ化する必要があります。XSLT1.0 では、これに Munechian Grouping を使用します。これは、グループのキーを定義することを意味します

<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-group要素を使用して行われることに注意してください。

于 2012-10-29T11:22:50.903 に答える