2017-02-15 19 views
0

現在のグループを集計し、集計が特定の条件を満たしている場合にのみレコードを出力するXSLTが入力をグループ化しています。 for-each-groupは正常に動作しますが、予告編のレコードの正確なレコード数は取得できません。ここで XSLT 2.0グループ化、集計、集計および条件

は、サンプル入力です:

<Book_Data> 
    <Book_Entry> 
    <Book> 
     <Book_ID>1</Book_ID> 
     <Book_Name>Test1</Book_Name> 
    </Book> 
    <Sales> 
     <Quantity>2</Quantity> 
    </Sales> 
    <Book_Entry> 
    <Book_Entry> 
    <Book> 
     <Book_ID>1</Book_ID> 
     <Book_Name>Test1</Book_Name> 
    </Book> 
    <Sales> 
     <Quantity>3</Quantity> 
    </Sales> 
    <Book_Entry> 
    <Book_Entry> 
    <Book> 
     <Book_ID>2</Book_ID> 
     <Book_Name>Test2</Book_Name> 
    </Book> 
    <Sales> 
     <Quantity>3</Quantity> 
    </Sales> 
    <Book_Entry> 
    <Book_Entry> 
    <Book> 
     <Book_ID>2</Book_ID> 
     <Book_Name>Test2</Book_Name> 
    </Book> 
    <Sales> 
     <Quantity>-3</Quantity> 
    </Sales> 
    <Book_Entry> 
</Book_Data> 

そして、ここでサンプルXSLT(2.0)である:

<xsl:for-each-group select="Book_Data/Book_Entry" group-by="Book/Book_ID"> 
     <xsl:if test="sum(current-group()/Sales/Quantity) != 0"> 
      <xsl:value-of select="Book/Book_ID"/> 
      <xsl:value-of select="Book/Book_Name"/> 
     </xsl:if> 
</xsl:for-each-group> 

<xsl:value-of select="count(distinct-values(Book_Data/Book_Entry/Book/Book_ID[sum(../../Sales/Quantity) != 0]))"/> 

問題は、トップセクションが正しく唯一の本1.出力されますが、トレーラーは両方をカウント私は外側の文脈でBook_IDを参照するために合計をどのように調整するかを理解できません。

+1

を(確かに積み上げるするという意味ではありません期待される出力を示してください。そのような文字列?)。 –

答えて

1

私はあなたが望むものを理解している場合は、変数にfor-each-groupの出力結果を格納し、グループを数えることができる:

<xsl:variable name="groups" as="xs:string*"> 
     <xsl:for-each-group select="Book_Data/Book_Entry" group-by="Book/Book_ID"> 
      <xsl:if test="sum(current-group()/Sales/Quantity) != 0"> 
       <xsl:sequence select="current-grouping-key()"/> 
      </xsl:if> 
     </xsl:for-each-group>   
    </xsl:variable> 

    <xsl:value-of select="$groups"/> 
    <xsl:value-of select="count($groups)"/> 
+0

こんにちは、マーティン 迅速かつ賢明な応答ありがとう。残念なことに私の問題を凝縮する際に、私はいくつかの重要な細部を省いた。つまり、for-each-groupは、あなたのメソッドを動作させないと思う1つ以上の項目を出力します。私はこれを反映するために質問を更新しました。 – RyanB

+1

グループごとにラッパー要素を使用してグループ化から一時的な出力を作成し、(a)最終出力用にラッパーを取り除き、(b)レポートフッターのラッパーを数えます。 –

+0

@ RyanB、マイケルのコメントがそれを解決するのに役立つかどうかを見て、次に質問を編集して、どの出力を作成したいのかを表示してください。現在は、for-each-groupを単に吐き出す多くの非構造化文字列 –

関連する問題