2016-05-16 4 views
0

私はプログラムとその初日のXMLを持っています。レポートのXSLTの一部として、結果を財務年度(7月1日〜6月30日)で除算したいと考えています。最終的な出力は、Excelスプレッドシートのさまざまなタブに表示されます(ただし、それは簡単です)。 私は年を分割するためにMuncheanグルーピングを使用しましたが、出力はデータの@year属性に基づいており、for-eachループに応じて最初または最後の会計年度を失います。 例データ(フォーマットをエクスポートするデータベースで設定されている):会計年度別にxsltでグループ化するにはどうすればよいですか?

<?xml version="1.0" encoding="UTF-8"?> 
<slots> 
    <SLOT oid="3229327812"> 
     <schedule_date> 
      <DATE year="2016" month="6" day="1" monthname="June" dateindays="42155"/> 
     </schedule_date> 
     <schedule_channel> 
      <CHANNEL name="Channel 1"/> 
     </schedule_channel> 
     <programme> 
      <PROG_DETAIL prog_title="Amber Anchor"/> 
     </programme> 
    </SLOT> 
    <SLOT oid="3229327813"> 
     <schedule_date> 
      <DATE year="2016" month="6" day="30" monthname="June" dateindays="42184"/> 
     </schedule_date> 
     <schedule_channel> 
      <CHANNEL name="Channel 1"/> 
     </schedule_channel> 
     <programme> 
      <PROG_DETAIL prog_title="Big Bang"/> 
     </programme> 
    </SLOT> 
    <SLOT oid="3229327815"> 
     <schedule_date> 
      <DATE year="2016" month="7" day="30" monthname="July" dateindays="42214"/> 
     </schedule_date> 
     <schedule_channel> 
      <CHANNEL name="Channel 1"/> 
     </schedule_channel> 
     <programme> 
      <PROG_DETAIL prog_title="Car Crash"/> 
     </programme> 
    </SLOT> 
    <SLOT oid="3229327814"> 
     <schedule_date> 
      <DATE year="2016" month="7" day="1" monthname="July" dateindays="42185"/> 
     </schedule_date> 
     <schedule_channel> 
      <CHANNEL name="Channel 2"/> 
     </schedule_channel> 
     <programme> 
      <PROG_DETAIL prog_title="Deep Dodo"/> 
     </programme> 
    </SLOT> 
    <SLOT oid="3229327815"> 
     <schedule_date> 
      <DATE year="2017" month="1" day="5" monthname="January" dateindays="42365"/> 
     </schedule_date> 
     <schedule_channel> 
      <CHANNEL name="Channel 2"/> 
     </schedule_channel> 
     <programme> 
      <PROG_DETAIL prog_title="Eerie Earl"/> 
     </programme> 
    </SLOT> 
    <SLOT oid="3229327815"> 
     <schedule_date> 
      <DATE year="2017" month="7" day="5" monthname="July" dateindays="42531"/> 
     </schedule_date> 
     <schedule_channel> 
      <CHANNEL name="Channel 1"/> 
     </schedule_channel> 
     <programme> 
      <PROG_DETAIL prog_title="Fall Flat"/> 
     </programme> 
    </SLOT> 
</slots> 

はXSLT:

<?xml version="1.0"?> 
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"> 
    <xsl:key name="kfyear1" use="@year" match="slots/SLOT/schedule_date/DATE[@month&lt;7]"/> 
    <xsl:key name="kfyear2" use="@year" match="slots/SLOT/schedule_date/DATE[@month&gt;6]"/> 
    <xsl:template match="/"> 
     <body> 
      <FinancialYear> 
      <!--<xsl:for-each select="/slots/SLOT/schedule_date/DATE[generate-id() = generate-id(key('kfyear1',@year)[1])]">--> 
       <xsl:for-each select="/slots/SLOT/schedule_date/DATE[generate-id() = generate-id(key('kfyear2',@year)[1])]"> 
        <xsl:variable name="fy" select="@year + (@month &gt; 6)"/> 
        <YEAR> 
         <xsl:text>Financial Year: </xsl:text><xsl:value-of select="$fy"/> 
        </YEAR> 
        <premieres> 
         <xsl:variable name="fy" select="@year + (@month &gt; 6)"/> 
         <xsl:call-template name="FinYear"> 
          <xsl:with-param name="fyr" select="$fy"/> 
         </xsl:call-template> 
        </premieres> 
       </xsl:for-each> 
      </FinancialYear> 
     </body> 
    </xsl:template> 
    <xsl:template name="FinYear"> 
     <xsl:param name="fyr"/> 
     <xsl:for-each select="/slots/SLOT[(schedule_date/DATE/@year+(schedule_date/DATE/@month &gt; 6)=$fyr)]"> 
      <PREMIERE> 
       <xsl:value-of select="schedule_channel/CHANNEL/@name"/><xsl:text>: </xsl:text> 
       <xsl:value-of select="programme/PROG_DETAIL/@prog_title"/><xsl:text>: </xsl:text> 
       <xsl:value-of select="schedule_date/DATE/@day"/><xsl:text> </xsl:text> 
       <xsl:value-of select="schedule_date/DATE/@monthname"/><xsl:text> </xsl:text> 
       <xsl:value-of select="schedule_date/DATE/@year"/> 
      </PREMIERE> 
     </xsl:for-each> 
    </xsl:template> 
</xsl:stylesheet> 

私のために、各ループ内でのキー 'kfyear1' を使用して、私は会計年度2016 & 2017を取得します。キー 'kfyear2'を使用して、私は財務年度2017 & 2018を取得します。3年間の財務年度はどのようにして取得できますか? 私はfor-eachループを放棄してテンプレートを使ってすべてをやる必要があると思うが、どうすればうまくいくのだろうか。

EDIT:期待される結果を追加:

<?xml version="1.0"?> 
<body> 
    <FinancialYear> 
     <YEAR>2016</YEAR> 
     <premieres> 
      <PREMIERE>Channel 1: Amber Anchor: 1 June 2016</PREMIERE> 
      <PREMIERE>Channel 1: Big Bang: 30 June 2016</PREMIERE> 
     </premieres> 
    </FinancialYear> 
    <FinancialYear> 
     <YEAR>2017</YEAR> 
     <premieres> 
      <PREMIERE>Channel 1: Car Crash: 30 July 2016</PREMIERE> 
      <PREMIERE>Channel 2: Deep Dodo: 1 July 2016</PREMIERE> 
      <PREMIERE>Channel 2: Eerie Earl: 5 January 2017</PREMIERE> 
     </premieres> 
    </FinancialYear> 
    <FinancialYear> 
     <YEAR>2018</YEAR> 
     <premieres> 
      <PREMIERE>Channel 1: Fall Flat: 5 July 2017</PREMIERE> 
     </premieres> 
    </FinancialYear> 
</body> 

答えて

0

をあなたが唯一本当にここつのキーを必要とする必要があり、グループにあなたの日付は会計年度によって

<xsl:key name="slot_by_year" match="DATE" use="@year + number(@month > 6)" /> 

をので、2016年の年と月の両方6、および2017年と5月には、「slot_by_year」という値が2016になります。

次に、別の会計年度を取得するには(各年度の)あなたはこの

<xsl:for-each select="SLOT/schedule_date/DATE[generate-id() = generate-id(key('slot_by_year', @year + number(@month > 6))[1])]"> 

を行うだろう。そして、この会計年度以内にSLOTの要素を取得するために、あなたはこれを行うだろう($fyは、現在の会計年度に設定されている)

<xsl:apply-templates select="key('slot_by_year', $fy)/ancestor::SLOT"/> 

このXSLTを試してみよう

<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="2.0"> 
    <xsl:output method="xml" indent="yes" /> 
    <xsl:key name="slot_by_year" match="DATE" use="@year + number(@month > 6)" /> 

    <xsl:template match="/slots"> 
    <body> 
     <xsl:for-each select="SLOT/schedule_date/DATE[generate-id() = generate-id(key('slot_by_year', @year + number(@month > 6))[1])]"> 
     <xsl:variable name="fy" select="@year + number(@month > 6)"/> 
     <financial_year> 
      <YEAR><xsl:value-of select="$fy" /></YEAR> 
      <premieres> 
      <xsl:apply-templates select="key('slot_by_year', $fy)/ancestor::SLOT"/> 
      </premieres> 
     </financial_year> 
     </xsl:for-each> 
    </body> 
    </xsl:template> 

    <xsl:template match="SLOT"> 
    <PREMIERE> 
     <xsl:value-of select="schedule_channel/CHANNEL/@name"/> 
     <xsl:text>: </xsl:text> 
     <xsl:value-of select="programme/PROG_DETAIL/@prog_title"/> 
    </PREMIERE> 
    </xsl:template> 
</xsl:stylesheet> 
+0

ありがとうございました。残念ながら、書かれているように、XSLTは2016年と2017年の財務年度をまとめて1年としています。 – Hockney

+0

謝罪します。私は財務年度が7月ではなく6月に始まった。私は私の答えを修正しました! –

+0

Aha!ありがとうございますTim - だからあなたは財務年度を正しく設定するためにキーを使用しています(これは私がやろうとしていましたが失敗しました)。私はxpath軸の周りに頭を向ける必要があります。 – Hockney

関連する問題