Сумма полей из нескольких записей группы - PullRequest
0 голосов
/ 27 июня 2018

Я пытаюсь принять значение разности удаленной суммы и добавленной суммы, чтобы сообщить о сумме, скорректированной в моем примере ниже. Я получаю поле суммы в двух разных записях. Я хочу вычесть сумму 1 из записи 1 из суммы 2 записи 2, если код для совпадения и один - удаленная запись, а другой - добавленная запись. И распечатать только добавленную запись с рассчитанной суммой.

Вот мой ввод xml

    <employee>
        <Compensation_One_Time_Payment isDeleted="1">
            <External_Payroll_Code>6090</External_Payroll_Code>
            <Earning_or_Deduction>E</Earning_or_Deduction>
            <Amount>100</Amount>
        </Compensation_One_Time_Payment>
        <Compensation_One_Time_Payment isAdded="1">
            <External_Payroll_Code>6090</External_Payroll_Code>
            <Earning_or_Deduction>E</Earning_or_Deduction>
            <Amount>200</Amount>
        </Compensation_One_Time_Payment>
        <Compensation_One_Time_Payment isAdded="1">
            <External_Payroll_Code>1111</External_Payroll_Code>
            <Earning_or_Deduction>E</Earning_or_Deduction>
            <Amount>300</Amount>
        </Compensation_One_Time_Payment>
    </employee>


My xslt is   

удалять добавлять

        <xsl:for-each-group select="$OTP_Group/root/OTP" group-by='concat(External_Payroll_Code,Action)'>
            <xsl:variable name="AdjustedAmount">
                <xsl:value-of select="sum(OTP[Action='Add']/Amount) - sum(OTP[Action='Delete']/Amount)"/>
            </xsl:variable>
            <OTP>
            <code>
                <xsl:value-of select="External_Payroll_Code"/> 
            </code>
            <NewAmount>
                <xsl:value-of select="$AdjustedAmount"/>
            </NewAmount>
            </OTP>
        </xsl:for-each-group>
    </xsl:template>

</xsl:stylesheet>

Пожалуйста, сообщите.

Мой текущий вывод. Входные данные будут содержать более одной записи на код, и я хочу рассчитать суммы на код. Но для группировки по коду, так как я уже вхожу для каждого, теперь я не могу посмотреть на другую запись в той же группе.

Токовый выход:

<OTP>
   <code>6090</code>
   <NewAmount>0</NewAmount>
</OTP>
<OTP>
   <code>6090</code>
   <NewAmount>0</NewAmount>
</OTP>
<OTP>
   <code>1111</code>
   <NewAmount>0</NewAmount>
</OTP>

Ожидаемый результат

 <OTP>
       <code>6090</code>
       <NewAmount>100</NewAmount>
    </OTP>
    <OTP>
       <code>1111</code>
       <NewAmount>300</NewAmount>
    </OTP>

1 Ответ

0 голосов
/ 27 июня 2018

Вы должны группировать чисто External_Payroll_Code (как вы хотите OTP на сотрудника), поэтому xsl:for-each-group должно быть таким ...

<xsl:for-each-group select="$OTP_Group/root/OTP" group-by='External_Payroll_Code'>

Кроме того, чтобы получить общую сумму, необходимо суммировать элементы текущей группы

<xsl:value-of select="sum(current-group()[Action='Add']/Amount) - sum(current-group()[Action='Delete']/Amount)"/>

Однако вам не нужно создавать переменную здесь. Я не вижу преимущества добавления узла Action, так как вы все равно можете легко запрашивать соответствующие атрибуты в xsl:for-each-group.

Попробуйте это XSLT

<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
    xmlns:xs="http://www.w3.org/2001/XMLSchema" exclude-result-prefixes="xs " version="2.0">
    <xsl:output method="xml" encoding="UTF-8" indent="yes" omit-xml-declaration="yes"/>
    <xsl:template match="employee">
        <xsl:for-each-group select="Compensation_One_Time_Payment" group-by='External_Payroll_Code'>
            <OTP>
            <code>
                <xsl:value-of select="External_Payroll_Code"/> 
            </code>
            <NewAmount>
                <xsl:value-of select="sum(current-group()[@isAdded='1']/Amount) - sum(current-group()[@isDeleted='1']/Amount)"/>
            </NewAmount>
            </OTP>
        </xsl:for-each-group>
    </xsl:template>
</xsl:stylesheet>
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...