Добавьте значение атрибута, используя foreach в XSLT - PullRequest
0 голосов
/ 10 мая 2018

Ниже представлена ​​моя структура XSLT, и я пытаюсь добавить (EARNEDINCOMEAMOUNT * PAYMENTFREQUENCYTYPE) для каждого EARNEDINCOME узла.

XSLT структура:

<EMPLOYMENT CUSTOMERNUMBER="1001349" CUSTOMERVERSIONNUMBER="31"  EMPLOYMENTSEQUENCENUMBER="2" EMPLOYMENTSTATUS="110" >  
  <EARNEDINCOME CUSTOMERNUMBER="1001349" CUSTOMERVERSIONNUMBER="31" EMPLOYMENTSEQUENCENUMBER="2" EARNEDINCOMESEQUENCENUMBER="1" EARNEDINCOMEAMOUNT="1142" PAYMENTFREQUENCYTYPE="12" PAYMENTFREQUENCYTYPE_TEXT="Monthly" />  
  <EARNEDINCOME CUSTOMERNUMBER="1001349" CUSTOMERVERSIONNUMBER="31" EMPLOYMENTSEQUENCENUMBER="2" EARNEDINCOMESEQUENCENUMBER="2" EARNEDINCOMEAMOUNT="4960" PAYMENTFREQUENCYTYPE="12" PAYMENTFREQUENCYTYPE_TEXT="Monthly" />
</EMPLOYMENT> 

То, что я до сих пор пробовал, это.

<xsl:for-each select=".//EARNEDINCOME">
    <xsl:attribute name="GROSSINCOME">
    <xsl:value-of select="(EARNEDINCOME[@EMPLOYMENTSEQUENCENUMBER=$vSequenceNumber]/@EARNEDINCOMEAMOUNT * EARNEDINCOME[@EMPLOYMENTSEQUENCENUMBER=$vSequenceNumber]/@PAYMENTFREQUENCYTYPE)" />
    <xsl:value-of select="@EARNEDINCOMEAMOUNT*@PAYMENTFREQUENCYTYPE"/>
    </xsl:attribute>
</xsl:for-each>

Что из этого получится, так это просто умножение каждого узла, но я не могу его добавить. Пожалуйста, помогите.

1 Ответ

0 голосов
/ 10 мая 2018

Существуют разные способы получения желаемой суммы в зависимости от используемой версии XSLT.

XSLT 2.0 позволяет использовать XPath в функции sum(), поэтому приведенный ниже код обеспечит желаемый результат.

<xsl:template match="EMPLOYMENT">
    <SOMENODE>
        <xsl:attribute name="GROSSINCOME">
            <xsl:value-of select="sum(EARNEDINCOME/(@EARNEDINCOMEAMOUNT * @PAYMENTFREQUENCYTYPE))" />
        </xsl:attribute>
    </SOMENODE>
</xsl:template>

XSLT 1.0 не предоставляет простого способа добиться этого. Если вы используете XSLT 1.0, вам придется написать рекурсивный вызов шаблона, который выполнит продукт для каждого узла, а затем продолжит добавлять их для всех узлов.

<xsl:template match="EMPLOYMENT">
    <SOMENODE>
        <xsl:attribute name="GROSSINCOME">
            <xsl:call-template name="ProductSum">
                <xsl:with-param name="earnedIncome" select="*" />
            </xsl:call-template>
        </xsl:attribute>
    </SOMENODE>
</xsl:template>

<xsl:template name="ProductSum">
    <xsl:param name="earnedIncome" />
    <xsl:param name="sum" select="0" />

    <xsl:variable name="nodeStart" select="$earnedIncome[1]" />
    <xsl:variable name="nodeEnd" select="$earnedIncome[position() > 1]" />
    <xsl:variable name="currSum" select="$nodeStart/@EARNEDINCOMEAMOUNT * $nodeStart/@PAYMENTFREQUENCYTYPE" />
    <xsl:choose>
        <xsl:when test="not($nodeEnd)">
            <xsl:value-of select="$sum + $currSum" />
        </xsl:when>
        <xsl:otherwise>
            <!-- Recursive call to the same template -->
            <xsl:call-template name="ProductSum">
                <xsl:with-param name="earnedIncome" select="$nodeEnd" />
                <xsl:with-param name="sum" select="$sum + $currSum" />
            </xsl:call-template>
        </xsl:otherwise>
    </xsl:choose>
</xsl:template>

Использование EXSLT (Функции расширения) - Если используется XSLT 1.0 и если вы можете использовать функции расширения, можно использовать функцию node-set().

<xsl:template match="/EMPLOYMENT">
    <!-- create a variable to store the EARNEDINCOME nodes along 
         with a new attribute ANNUALINCOME that has the product 
         of the attributes -->
    <xsl:variable name="nodes">
        <xsl:for-each select="EARNEDINCOME">
            <xsl:copy>
                <xsl:copy-of select="@*"/>
                <!-- add a new attribute to EARNEDINCOME node -->
                <xsl:attribute name="ANNUALINCOME">
                    <xsl:value-of select="@EARNEDINCOMEAMOUNT * @PAYMENTFREQUENCYTYPE" />
                </xsl:attribute>
            </xsl:copy>
        </xsl:for-each>
    </xsl:variable>
    <SOMENODE>
        <xsl:attribute name="GROSSINCOME">
            <!-- use the node-set function to compute the sum
                 of this new attribute from the above variable -->
            <xsl:value-of select="sum(exslt:node-set($nodes)/EARNEDINCOME/@ANNUALINCOME)" />
        </xsl:attribute>
    </SOMENODE>
</xsl:template>  

Все XSLT будут выдавать одинаковый вывод

<SOMENODE GROSSINCOME="73224"/>
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...