Использование sum () для суммирования значений с помощью вложенного foreach () - PullRequest
1 голос
/ 11 июня 2019

Мне нужна помощь в правильном указании входного параметра для sum ().Я столкнулся с выводом sum () для объединения значений вместо суммирования.

Моя цель: суммировать значения Column6 , когда Column2 равно " invoice"В приведенном ниже примере у меня есть 2000 и 1000 для Column6, столбец которого является" invoice ".Я ожидаю, что он покажет 3000 для <TotalAmount>

<Root>
<DataArea>
    <Row>... </Row>
    <Row>... </Row>
    <!-- and so on -->
    <Row>
        <Column1>29/03/19</Column1>
        <Column2>cr note</Column2>
        <Column3>092-213280101</Column3>
        <Column4>1,474.98 </Column4>
        <Column5>103.25 </Column5>
        <Column6>2000 </Column6>
    </Row>
    <Row>
        <Column1>29/03/19</Column1>
        <Column2>invoice</Column2>
        <Column3>092-213280101</Column3>
        <Column4>1,474.98 </Column4>
        <Column5>103.25 </Column5>
        <Column6>2000 </Column6>
    </Row>
    <Row>
        <Column1>11/06/19</Column1>
        <Column2>invoice</Column2>
        <Column3>123-123456789</Column3>
        <Column4>100.50 </Column4>
        <Column5>100.50 </Column5>
        <Column6>1000</Column6>
    </Row>
</DataArea>
</Root>

<xsl:for-each
    select="Root/DataArea/Row">
    <xsl:if ... >
        <TransactionSummary>
            <DebitSummary>
                <TotalAmount>
                <xsl:attribute name="currencyID"></xsl:attribute>
                <xsl:for-each select="../Row">
                    <xsl:if test="(Column2 = 'invoice') and (position() > 9) ">    
                        <xsl:value-of select="sum(../Column6)" />
                    </xsl:if>
                </xsl:for-each>
                </TotalAmount>
            </DebitSummary>
        </TransactionSummary>
    </xsl:if>
</xsl:for-each>

Я пытался sum(Column6), не сработало.Output: 20001000

Я пытался sum(../Column6), не работал.Output: 00

Я пытался sum(../Row/Column6), не работал.Output: Cannot convert string "" to a double

Я пытался sum(Root/DataArea/Row/Column6), не работал.Output: 00

Буду признателен за любую помощь.

Спасибо.

Ответы [ 2 ]

1 голос
/ 11 июня 2019

Здесь вам не нужен внутренний xsl:for-each, вы можете сделать это с помощью одного xsl:value-of с условиями в select

<xsl:value-of select="sum(../Row[Column2 = 'invoice' and position() > 9]/Column6)" />

Или в контексте вашего фрагмента ....

<xsl:for-each select="Root/DataArea/Row">
  <TransactionSummary>
    <DebitSummary>
      <TotalAmount currencyID="">
        <xsl:value-of select="sum(../Row[Column2 = 'invoice' and position() > 9]/Column6)" />
      </TotalAmount>
    </DebitSummary>
  </TransactionSummary>
</xsl:for-each>
0 голосов
/ 12 июня 2019

Кажется, вы хотите что-то вроде этого :

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

  <xsl:template match="/">
        <TransactionSummary>
            <DebitSummary>
                <TotalAmount currencyID="someId">
                   <xsl:value-of select="sum(/*/*/Row[Column2 = 'invoice']/Column6)"/>
                </TotalAmount>
            </DebitSummary>
         </TransactionSummary>
   </xsl:template>
</xsl:stylesheet>

Когда это преобразование применяется к предоставленному документу XML :

<Root>
<DataArea>
    <Row>... </Row>
    <Row>... </Row>
    <!-- and so on -->
    <Row>
        <Column1>29/03/19</Column1>
        <Column2>cr note</Column2>
        <Column3>092-213280101</Column3>
        <Column4>1,474.98 </Column4>
        <Column5>103.25 </Column5>
        <Column6>2000 </Column6>
    </Row>
    <Row>
        <Column1>29/03/19</Column1>
        <Column2>invoice</Column2>
        <Column3>092-213280101</Column3>
        <Column4>1,474.98 </Column4>
        <Column5>103.25 </Column5>
        <Column6>2000 </Column6>
    </Row>
    <Row>
        <Column1>11/06/19</Column1>
        <Column2>invoice</Column2>
        <Column3>123-123456789</Column3>
        <Column4>100.50 </Column4>
        <Column5>100.50 </Column5>
        <Column6>1000</Column6>
    </Row>
</DataArea>
</Root>

желаемый результат получен :

<TransactionSummary>
   <DebitSummary>
      <TotalAmount currencyID="someId">3000</TotalAmount>
   </DebitSummary>
</TransactionSummary>
...