2017-02-15 19 views
0

У меня есть XSLT, который группирует вход, суммирует текущую группу и выводит только запись, если сумма соответствует определенному условию. Для каждой группы отлично работает, но я не могу получить точное количество записей для записи трейлера.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

Hi Martin, Спасибо за быстрый и умный ответ. К сожалению, в связи с моей проблемой я оставил некоторые важные детали. А именно, для каждой группы выдается более одного элемента, который, по моему мнению, делает ваш метод неработоспособным. Я обновил вопрос, чтобы отразить это. – RyanB

+1

Вы можете создать временный вывод из группировки с использованием элемента оболочки для каждой группы, затем (а) разбить обертки для окончательного вывода и (b) подсчитать обертки для нижнего колонтитула отчета. –

+0

@ RyanB, посмотрите, помогает ли Майкл комментарий, если нет, тогда отредактируйте свой вопрос и покажите, какой именно вывод вы хотите создать, в настоящее время неясно, хотите ли вы, чтобы 'for-each-group' просто плюнуть много неструктурированных строк. –

 Смежные вопросы

  • Нет связанных вопросов^_^