-1

XSLT 2.0 を使用して、製品 [Widgets] のすべての個々の営業担当者 [VOL] を、営業チーム、部門別にグループ化された年/年四半期ごとに合計しようとしています。複数の製品タイプが存在する可能性がありますが、コードを単純化するために、ここでは 1 つのタイプとして残しました。

  1. 特定の年の YearQtr 値のリストを取得するために for-each を使用することができましたが、SalesPerson/Performance の子として表示されるすべての Year および YearQtr 要素の個別のリストを取得する方法がわかりませんでした.
  2. currentgroup() を試しましたが、グループ化を指定して、各営業担当者ではなく部門レベルで合計のみを取得する方法がわかりません。

私が扱っているXMLは次のとおりです。

<salesteam id="Team1">
    <department id="dept1">
        <salespeople>
            <salesperson id="98765">
                <performance>
                    <year id="2013">
                        <yearqtr id="1">
                            <yearMonth id="1">
                                <products>
                                    <widgets>
                                        <vol>5</vol>
                                        <val>50000</val>
                                    </widgets>
                                </products>
                            </yearMonth>
                            <yearMonth id="2">
                                <products>
                                    <widgets>
                                        <vol>10</vol>
                                        <val>100000</val>
                                    </widgets>
                                </products>
                            </yearMonth>
                            <yearMonth id="3">
                                <products>
                                    <widgets>
                                        <vol>15</vol>
                                        <val>150000</val>
                                    </widgets>
                                </products>
                            </yearMonth>
                        </yearqtr>
                        <yearqtr id="2">
                            <yearMonth id="4">
                                <products>
                                    <widgets>
                                        <vol>20</vol>
                                        <val>200000</val>
                                    </widgets>
                                </products>
                            </yearMonth>
                            <yearMonth id="5">
                                <products>
                                    <widgets>
                                        <vol>25</vol>
                                        <val>250000</val>
                                    </widgets>
                                </products>
                            </yearMonth>
                            <yearMonth id="6">
                                <products>
                                    <widgets>
                                        <vol>30</vol>
                                        <val>300000</val>
                                    </widgets>
                                </products>
                            </yearMonth>
                        </yearqtr>
                    </year>
                </performance>
            </salesperson>
            <salesperson id="12345">
                <performance>
                    <year id="2013">
                        <yearqtr id="1">
                            <yearMonth id="1">
                                <products>
                                    <widgets>
                                        <vol>5</vol>
                                        <val>50000</val>
                                    </widgets>
                                </products>
                            </yearMonth>
                            <yearMonth id="2">
                                <products>
                                    <widgets>
                                        <vol>10</vol>
                                        <val>100000</val>
                                    </widgets>
                                </products>
                            </yearMonth>
                            <yearMonth id="3">
                                <products>
                                    <widgets>
                                        <vol>15</vol>
                                        <val>150000</val>
                                    </widgets>
                                </products>
                            </yearMonth>
                        </yearqtr>
                        <yearqtr id="2">
                            <yearMonth id="4">
                                <products>
                                    <widgets>
                                        <vol>20</vol>
                                        <val>200000</val>
                                    </widgets>
                                </products>
                            </yearMonth>
                            <yearMonth id="5">
                                <products>
                                    <widgets>
                                        <vol>25</vol>
                                        <val>250000</val>
                                    </widgets>
                                </products>
                            </yearMonth>
                            <yearMonth id="6">
                                <products>
                                    <widgets>
                                        <vol>30</vol>
                                        <val>300000</val>
                                    </widgets>
                                </products>
                            </yearMonth>
                        </yearqtr>
                    </year>
                </performance>
            </salesperson>
        </salespeople>
    </department>
</salesteam>

私が達成したいことは

<table>
<tbody>
<tr>
<th>2013Q1</th>
<th>2013Q2</th>
<th>2013Q3</th>
<th>2013Q4</th>
</tr>
<tr>
<td>30</td>
<td>75</td>
<td>0</td>
<td>0</td>
</tr>
</tbody>
</table>
4

1 に答える 1

0

ここでグループ化を本当に使用する必要がありますか? 1 年に常に 4 つの四半期があると安全に想定できる場合は、次のように、特定の四半期と年のすべてのウィジェット ボリュームを合計する sum ステートメントを作成できます (ここで、$year は年を保持するパラメーターであり、$四半期を保持する四半期)

<xsl:value-of select="sum(//year[@id=$year]/yearqtr[@id=$qtr]/yearMonth/products/widgets/vol)" />

パラメータとしてqtrを使用して、これを名前付きテンプレートに配置し、4 回呼び出すことができます。

<xsl:call-template name="sum"><xsl:with-param name="qtr" select="1" /></xsl:call-template>
<xsl:call-template name="sum"><xsl:with-param name="qtr" select="2" /></xsl:call-template>
<xsl:call-template name="sum"><xsl:with-param name="qtr" select="3" /></xsl:call-template>
<xsl:call-template name="sum"><xsl:with-param name="qtr" select="4" /></xsl:call-template>

ただし、キーを使用して特定の年と四半期のウィジェットを検索する方が、少しクリーンで効率的かもしれません。

<xsl:key name="quarters" match="yearqtr" use="concat(../@id, '|', @id)"/>

次に、あなたの合計はこれになります

<xsl:value-of 
     select="sum(key('quarters', concat($year, '|', $qtr))/yearMonth/products/widgets/vol)"/>

この場合の完全な XSLT は次のとおりです。

<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
   <xsl:output method="xml" indent="yes"/>

   <xsl:key name="quarters" match="yearqtr" use="concat(../@id, '|', @id)"/>

   <xsl:param name="year" select="2013"/>

   <xsl:template match="/*">
      <table>
         <tbody>
            <tr>
               <th><xsl:value-of select="$year"/>Q1</th>
               <th><xsl:value-of select="$year"/>Q2</th>
               <th><xsl:value-of select="$year"/>Q3</th>
               <th><xsl:value-of select="$year"/>Q4</th>
            </tr>
            <tr>
               <xsl:call-template name="sum"><xsl:with-param name="qtr" select="1" /></xsl:call-template>
               <xsl:call-template name="sum"><xsl:with-param name="qtr" select="2" /></xsl:call-template>
               <xsl:call-template name="sum"><xsl:with-param name="qtr" select="3" /></xsl:call-template>
               <xsl:call-template name="sum"><xsl:with-param name="qtr" select="4" /></xsl:call-template>
            </tr>
         </tbody>
      </table>
   </xsl:template>

   <xsl:template name="sum">
      <xsl:param name="qtr"/>
      <td>
         <xsl:value-of select="sum(key('quarters', concat($year, '|', $qtr))/yearMonth/products/widgets/vol)"/>
      </td>
   </xsl:template>
</xsl:stylesheet>

ただし、グループ化を使用したい場合は、XSLT2.0 でそれを行う方法を次に示します。

<xsl:stylesheet version="2.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
   <xsl:output method="xml" indent="yes"/>
   <xsl:param name="year" select="2013"/>

   <xsl:template match="/*">
      <table>
         <tbody>
            <tr>
               <xsl:for-each-group select="//year[@id=$year]/yearqtr" group-by="@id">
                    <td><xsl:value-of select="concat($year, 'Q', current-grouping-key())" /></td>
               </xsl:for-each-group>
            </tr>
            <tr>
               <xsl:for-each-group select="//year[@id=$year]/yearqtr" group-by="@id">
                    <td><xsl:value-of select="sum(current-group()/yearMonth/products/widgets/vol)"/></td>
               </xsl:for-each-group>
            </tr>
         </tbody>
      </table>
   </xsl:template>
</xsl:stylesheet>

ただし、これは存在する四半期のみを表示するため、たとえば、四半期 4のyearqtr要素がない場合、四半期 1 から 3 のみが表示されます。

編集:複数の年がある場合、それらを別々の列に入れたいと仮定すると、次のようにグループ化します:

<xsl:for-each-group select="//yearqtr" group-by="concat(../@id, 'Q', @id)">

この場合の完全な XSLT は次のとおりです。

<xsl:stylesheet version="2.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
   <xsl:output method="xml" indent="yes"/>

   <xsl:template match="/*">
      <table>
         <tbody>
            <tr>
               <xsl:for-each-group select="//yearqtr" group-by="concat(../@id, 'Q', @id)">
                    <td><xsl:value-of select="current-grouping-key()" /></td>
               </xsl:for-each-group>
            </tr>
            <tr>
               <xsl:for-each-group select="//yearqtr" group-by="concat(../@id, 'Q', @id)">
                    <td><xsl:value-of select="sum(current-group()/yearMonth/products/widgets/vol)"/></td>
               </xsl:for-each-group>
            </tr>
         </tbody>
      </table>
   </xsl:template>
</xsl:stylesheet>
于 2013-03-17T17:07:09.293 に答える