2016-03-07 8 views
0

XSL заводит меня в орехи, и я надеюсь, что кто-то может мне помочь с этим. Код готов для копирования пасты.Сумма группированных элементов в XSL 1.0

Я делаю группу в XSL 1.0, и я хочу сделать сумму для всех сгруппированных элементов «Сумма».

Мои данные выглядят следующим образом.

<CustInvoiceTable class="entity"> 
    <McsCmBilCalcInvoiceLine class="entity"> 
     <Amount>0.05</Amount> 
     <ItemId>ITM-0000088</ItemId> 
     <McsCmBilProductItem class="entity"> 
      <CgiBundleLines>1</CgiBundleLines> 
     </McsCmBilProductItem> 
    </McsCmBilCalcInvoiceLine> 
    <McsCmBilCalcInvoiceLine class="entity"> 
     <Amount>0.07</Amount> 
     <ItemId>ITM-0000088</ItemId> 
     <McsCmBilProductItem class="entity"> 
      <CgiBundleLines>1</CgiBundleLines> 
     </McsCmBilProductItem> 
    </McsCmBilCalcInvoiceLine> 
    <McsCmBilCalcInvoiceLine class="entity"> 
     <Amount>0.16</Amount> 
     <ItemId>ITM-0000091</ItemId> 
     <McsCmBilProductItem class="entity"> 
      <CgiBundleLines>1</CgiBundleLines> 
     </McsCmBilProductItem> 
    </McsCmBilCalcInvoiceLine> 
    <McsCmBilCalcInvoiceLine class="entity"> 
     <Amount>0.22</Amount> 
     <ItemId>ITM-0000091</ItemId> 
     <McsCmBilProductItem class="entity"> 
      <CgiBundleLines>1</CgiBundleLines> 
     </McsCmBilProductItem> 
    </McsCmBilCalcInvoiceLine> 
    <McsCmBilCalcInvoiceLine class="entity"> 
     <Amount>1.33</Amount> 
     <ItemId>ITM-0000098</ItemId> 
     <McsCmBilProductItem class="entity"> 
      <CgiBundleLines>1</CgiBundleLines> 
     </McsCmBilProductItem> 
    </McsCmBilCalcInvoiceLine> 
    <McsCmBilCalcInvoiceLine class="entity"> 
     <Amount>1.82</Amount> 
     <ItemId>ITM-0000098</ItemId> 
     <McsCmBilProductItem class="entity"> 
      <CgiBundleLines>1</CgiBundleLines> 
     </McsCmBilProductItem> 
    </McsCmBilCalcInvoiceLine> 
    <McsCmBilCalcInvoiceLine class="entity"> 
     <Amount>0.01</Amount> 
     <ItemId>ITM-0000086</ItemId> 
     <McsCmBilProductItem class="entity"> 
      <CgiBundleLines>1</CgiBundleLines> 
     </McsCmBilProductItem> 
    </McsCmBilCalcInvoiceLine> 
    <McsCmBilCalcInvoiceLine class="entity"> 
     <Amount>0.01</Amount> 
     <ItemId>ITM-0000086</ItemId> 
     <McsCmBilProductItem class="entity"> 
      <CgiBundleLines>1</CgiBundleLines> 
     </McsCmBilProductItem> 
    </McsCmBilCalcInvoiceLine> 
    <McsCmBilCalcInvoiceLine class="entity"> 
     <Amount>0.05</Amount> 
     <ItemId>ITM-0000062</ItemId> 
     <McsCmBilProductItem class="entity"> 
      <CgiBundleLines>2</CgiBundleLines> 
     </McsCmBilProductItem> 
    </McsCmBilCalcInvoiceLine> 
    <McsCmBilCalcInvoiceLine class="entity"> 
     <Amount>0.06</Amount> 
     <ItemId>ITM-0000062</ItemId> 
     <McsCmBilProductItem class="entity"> 
      <CgiBundleLines>2</CgiBundleLines> 
     </McsCmBilProductItem> 
    </McsCmBilCalcInvoiceLine> 
    <McsCmBilCalcInvoiceLine class="entity"> 
     <Amount>0.02</Amount> 
     <ItemId>ITM-0000111</ItemId> 
     <McsCmBilProductItem class="entity"> 
      <CgiBundleLines>1</CgiBundleLines> 
     </McsCmBilProductItem> 
    </McsCmBilCalcInvoiceLine> 
    <McsCmBilCalcInvoiceLine class="entity"> 
     <Amount>0.02</Amount> 
     <ItemId>ITM-0000111</ItemId> 
     <McsCmBilProductItem class="entity"> 
      <CgiBundleLines>1</CgiBundleLines> 
     </McsCmBilProductItem> 
    </McsCmBilCalcInvoiceLine> 
    <McsCmBilCalcInvoiceLine class="entity"> 
     <Amount>0.06</Amount> 
     <ItemId>ITM-0000089</ItemId> 
     <McsCmBilProductItem class="entity"> 
      <CgiBundleLines>1</CgiBundleLines> 
     </McsCmBilProductItem> 
    </McsCmBilCalcInvoiceLine> 
    <McsCmBilCalcInvoiceLine class="entity"> 
     <Amount>0.08</Amount> 
     <ItemId>ITM-0000089</ItemId> 
     <McsCmBilProductItem class="entity"> 
      <CgiBundleLines>1</CgiBundleLines> 
     </McsCmBilProductItem> 
    </McsCmBilCalcInvoiceLine> 
    <McsCmBilCalcInvoiceLine class="entity"> 
     <Amount>1.96</Amount> 
     <ItemId>ITM-0000092</ItemId> 
     <McsCmBilProductItem class="entity"> 
      <CgiBundleLines>1</CgiBundleLines> 
     </McsCmBilProductItem> 
    </McsCmBilCalcInvoiceLine> 
    <McsCmBilCalcInvoiceLine class="entity"> 
     <Amount>2.69</Amount> 
     <ItemId>ITM-0000092</ItemId> 
     <McsCmBilProductItem class="entity"> 
      <CgiBundleLines>1</CgiBundleLines> 
     </McsCmBilProductItem> 
    </McsCmBilCalcInvoiceLine> 
    <McsCmBilCalcInvoiceLine class="entity"> 
     <Amount>0.07</Amount> 
     <ItemId>ITM-0000101</ItemId> 
     <McsCmBilProductItem class="entity"> 
      <CgiBundleLines>1</CgiBundleLines> 
     </McsCmBilProductItem> 
    </McsCmBilCalcInvoiceLine> 
    <McsCmBilCalcInvoiceLine class="entity"> 
     <Amount>0.10</Amount> 
     <ItemId>ITM-0000101</ItemId> 
     <McsCmBilProductItem class="entity"> 
      <CgiBundleLines>1</CgiBundleLines> 
     </McsCmBilProductItem> 
    </McsCmBilCalcInvoiceLine> 
    <McsCmBilCalcInvoiceLine class="entity"> 
     <Amount>0.07</Amount> 
     <ItemId>ITM-0000102</ItemId> 
     <McsCmBilProductItem class="entity"> 
      <CgiBundleLines>1</CgiBundleLines> 
     </McsCmBilProductItem> 
    </McsCmBilCalcInvoiceLine> 
    <McsCmBilCalcInvoiceLine class="entity"> 
     <Amount>0.10</Amount> 
     <ItemId>ITM-0000102</ItemId> 
     <McsCmBilProductItem class="entity"> 
      <CgiBundleLines>1</CgiBundleLines> 
     </McsCmBilProductItem> 
    </McsCmBilCalcInvoiceLine> 
    <McsCmBilCalcInvoiceLine class="entity"> 
     <Amount>6.69</Amount> 
     <ItemId>ITM-0000083</ItemId> 
     <McsCmBilProductItem class="entity"> 
      <CgiBundleLines>1</CgiBundleLines> 
     </McsCmBilProductItem> 
    </McsCmBilCalcInvoiceLine> 
    <McsCmBilCalcInvoiceLine class="entity"> 
     <Amount>7.96</Amount> 
     <ItemId>ITM-0000083</ItemId> 
     <McsCmBilProductItem class="entity"> 
      <CgiBundleLines>1</CgiBundleLines> 
     </McsCmBilProductItem> 
    </McsCmBilCalcInvoiceLine> 
    <McsCmBilCalcInvoiceLine class="entity"> 
     <Amount>0.15</Amount> 
     <ItemId>ITM-0000067</ItemId> 
     <McsCmBilProductItem class="entity"> 
      <CgiBundleLines>1</CgiBundleLines> 
     </McsCmBilProductItem> 
    </McsCmBilCalcInvoiceLine> 
    <McsCmBilCalcInvoiceLine class="entity"> 
     <Amount>0.21</Amount> 
     <ItemId>ITM-0000067</ItemId> 
     <McsCmBilProductItem class="entity"> 
      <CgiBundleLines>1</CgiBundleLines> 
     </McsCmBilProductItem> 
    </McsCmBilCalcInvoiceLine> 

    <McsCmBilCalcInvoiceLine class="entity"> 
     <Amount>96.00</Amount> 
     <ItemId>ITM-0000125</ItemId> 
     <McsCmBilProductItem class="entity"> 
      <CgiBundleLines>0</CgiBundleLines> 
     </McsCmBilProductItem> 
    </McsCmBilCalcInvoiceLine> 

    <McsCmBilCalcInvoiceLine class="entity"> 
     <Amount>-88.00</Amount> 
     <ItemId>ITM-0000069</ItemId> 
    </McsCmBilCalcInvoiceLine> 

    <McsCmBilCalcInvoiceLine class="entity"> 
     <Amount>-0.66</Amount> 
     <ItemId>ITM-0000083</ItemId> 
    </McsCmBilCalcInvoiceLine> 
    <McsCmBilCalcInvoiceLine class="entity"> 
     <Amount>-0.22</Amount> 
     <ItemId>ITM-0000092</ItemId> 
    </McsCmBilCalcInvoiceLine> 
    <McsCmBilCalcInvoiceLine class="entity"> 
     <Amount>-0.55</Amount> 
     <ItemId>ITM-0000098</ItemId> 
    </McsCmBilCalcInvoiceLine> 

</CustInvoiceTable> 

И XSL:

<xsl:stylesheet version="1.0" 
       xmlns:xsl="http://www.w3.org/1999/XSL/Transform"> 
    <xsl:key name="Lines-by-ItemId" match="CustInvoiceTable/McsCmBilCalcInvoiceLine" use="CustInvoiceTable/McsCmBilCalcInvoiceLine/ItemId" /> 

    <xsl:output method="xml" indent="yes" /> 

    <xsl:template match="/"> 

     <root> 

      <xsl:for-each select="CustInvoiceTable/McsCmBilCalcInvoiceLine[count(. | key('Lines-by-ItemId', ItemId)[1]) = 1][McsCmBilProductItem/CgiBundleLines = 1][not(ItemId = preceding-sibling::McsCmBilCalcInvoiceLine/ItemId)]"> 
       <xsl:sort select="ItemId" /> 
       <GroupInvoiceLine> 
        <ItemId><xsl:value-of select="ItemId" /></ItemId> 
        <SumAmount><xsl:value-of select="sum(Amount)"/></SumAmount> <!-- This does not work --> 
       </GroupInvoiceLine> 
      </xsl:for-each> 

     </root> 

    </xsl:template> 

</xsl:stylesheet> 

Результат: Скажите, что мы группа на "ITM-0000088" Я ожидаю, что результат будет 0,12. В настоящее время он просто захватывает первую запись.

Если мы сгруппируем на "ITM-0000083", то ожидаем, что сумма будет равна 6.69 + 7.96 = 14.65 и NOT 6.69 + 7.96 + -0.66 = 13.99, так как последняя «McsCmBilCalcInvoiceLine» с «ItemId = ITM-0000083» делает не имеет «CgiBundleLines = 1» в своем «McsCmBilProductItem».

+0

У вас есть много кода здесь. Пожалуйста, опубликуйте минимальный, полный, проверенный, пример ([MCVE] (http://stackoverflow.com/help/mcve)) – MarkyPython

+0

Да - я уменьшу количество данных в следующий раз. Спасибо. – Lange

ответ

0

Определить ключ как <xsl:key name="Lines-by-ItemId" match="CustInvoiceTable/McsCmBilCalcInvoiceLine" use="ItemId" />, в качестве значения по use атрибута вычисляется относительно согласованного узла.

Тогда сначала посмотрим, как использовать ключ и Muenchian группировку, используйте

 <xsl:for-each select="CustInvoiceTable/McsCmBilCalcInvoiceLine[count(. | key('Lines-by-ItemId', ItemId)[1]) = 1]"> 
      <xsl:sort select="ItemId" /> 
      <GroupInvoiceLine> 
       <ItemId><xsl:value-of select="ItemId" /></ItemId> 
       <SumAmount><xsl:value-of select="sum(key('Lines-by-ItemId', ItemId)/Amount)"/></SumAmount> 
      </GroupInvoiceLine> 
     </xsl:for-each> 

Что касается другого условия, рассмотреть вопрос о включении его в ключевой схеме:

<xsl:stylesheet version="1.0" 
       xmlns:xsl="http://www.w3.org/1999/XSL/Transform"> 
    <xsl:key name="Lines-by-ItemId" match="CustInvoiceTable/McsCmBilCalcInvoiceLine[McsCmBilProductItem/CgiBundleLines = 1]" use="ItemId" /> 

    <xsl:output method="xml" indent="yes" /> 

    <xsl:template match="/"> 

     <root> 

      <xsl:for-each select="CustInvoiceTable/McsCmBilCalcInvoiceLine[McsCmBilProductItem/CgiBundleLines = 1][count(. | key('Lines-by-ItemId', ItemId)[1]) = 1]"> 
       <xsl:sort select="ItemId" /> 
       <GroupInvoiceLine> 
        <ItemId><xsl:value-of select="ItemId" /></ItemId> 
        <SumAmount><xsl:value-of select="sum(key('Lines-by-ItemId', ItemId)/Amount)"/></SumAmount> 
       </GroupInvoiceLine> 
      </xsl:for-each> 

     </root> 

    </xsl:template> 

</xsl:stylesheet> 
+0

Блестящая работа снова. Благодарю. – Lange

0

Во-первых, ключ должен быть определен как:

<xsl:key name="Lines-by-ItemId" match="McsCmBilCalcInvoiceLine" use="ItemId" /> 

Затем измените:

<SumAmount><xsl:value-of select="sum(Amount)"/></SumAmount> 

к:

<SumAmount><xsl:value-of select="sum(key('Lines-by-ItemId',ItemId)/Amount)"/></SumAmount> 
+0

Это не дает желаемого результата. Он не учитывает, что должны быть сгруппированы только строки с 'CgiBundleLines = 1'. Спасибо, в любом случае. – Lange

+0

@Lange Вы можете добавить предикат к суммируемой группе. (Это не хорошая стратегия, чтобы спросить о нескольких предметах одновременно). –

+0

Спасибо, Майкл. Возможно, вы правы. Я буду воздерживаться от этого в будущем. – Lange

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