2017-02-15 85 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,看看迈克尔的评论是否有助于解决它,如果没有,然后编辑你的问题,并确切地显示你想要创建的输出,目前还不清楚你是否真的想让“每个组”都只是吐出来大量的非结构化字符串。 –