如何使用xslt代码根据条件从xml中求和

时间:2016-12-05 20:39:45

标签: xml xslt-1.0 xslt-2.0

我需要一些帮助来使用xslt代码添加数量 - 每当时间超过补偿生效日期时,添加数量值将在下面的示例中为36。

Please see xml example.

<?xml version="1.0" encoding="UTF-8"?>
<pi:Payroll_Extract_Employees xmlns:pi="urn:com.workday/picof">
    <pi:PayGroup>
        <pi:Header>
            <pi:Version>24</pi:Version>

        </pi:Header>
        <pi:Employee>
            <pi:Summary>
                <pi:Employee_ID>123</pi:Employee_ID>
            </pi:Summary>
            <pi:Personal>
                <pi:First_Name>test</pi:First_Name>
                <pi:Last_Name>last anme</pi:Last_Name>

            </pi:Personal>
            <pi:Position>
                <pi:Operation>ADD</pi:Operation>
                <pi:Compensation_Effective_Date pi:PriorValue=""
                    >20161212</pi:Compensation_Effective_Date>

            </pi:Position>
            <pi:Position>
                <pi:Operation>REMOVE</pi:Operation>
                 <pi:Compensation_Effective_Date>20160401</pi:Compensation_Effective_Date>
            </pi:Position>
            <pi:Time_Off>
                <pi:Code pi:PriorValue="">CHN_PERSONAL_PLAN</pi:Code>
                <pi:Time_Off_Date pi:PriorValue="">20161122</pi:Time_Off_Date>
                <pi:Quantity pi:PriorValue="">8</pi:Quantity>
                <pi:Unit_of_Time pi:PriorValue="">HOURS</pi:Unit_of_Time>
            </pi:Time_Off>
            <pi:Time_Off>
                 <pi:Code pi:PriorValue="">CHN_PERSONAL_PLAN</pi:Code>
                 <pi:Time_Off_Date pi:PriorValue="">20161123</pi:Time_Off_Date>
                <pi:Quantity pi:PriorValue="">8</pi:Quantity>
                <pi:Unit_of_Time pi:PriorValue="">HOURS</pi:Unit_of_Time>
            </pi:Time_Off>
            <pi:Time_Off>
                <pi:Code pi:PriorValue="">CHN_PERSONAL_PLAN</pi:Code>
                <pi:Time_Off_Date pi:PriorValue="">20161211</pi:Time_Off_Date>
                <pi:Quantity pi:PriorValue="">8</pi:Quantity>
                <pi:Unit_of_Time pi:PriorValue="">HOURS</pi:Unit_of_Time>
            </pi:Time_Off>
            <pi:Time_Off>
                <pi:Code pi:PriorValue="">CHN_PERSONAL_PLAN</pi:Code>
                <pi:Time_Off_Date pi:PriorValue="">20161212</pi:Time_Off_Date>
                <pi:Quantity pi:PriorValue="">8</pi:Quantity>
                <pi:Unit_of_Time pi:PriorValue="">HOURS</pi:Unit_of_Time>
            </pi:Time_Off>
            <pi:Time_Off>
                <pi:Time_Off_Type pi:PriorValue="">TOT_Personal_Leave_Hours</pi:Time_Off_Type>
                <pi:Time_Off_Date pi:PriorValue="">20161213</pi:Time_Off_Date>
                <pi:Quantity pi:PriorValue="">8</pi:Quantity>
                <pi:Unit_of_Time pi:PriorValue="">HOURS</pi:Unit_of_Time>
            </pi:Time_Off>
            <pi:Time_Off>
                <pi:Code pi:PriorValue="">CHN_PERSONAL_PLAN</pi:Code>
                <pi:Time_Off_Date pi:PriorValue="">20161214</pi:Time_Off_Date>
                <pi:Quantity pi:PriorValue="">8</pi:Quantity>
                <pi:Unit_of_Time pi:PriorValue="">HOURS</pi:Unit_of_Time>
            </pi:Time_Off>
               </pi:Employee>
    </pi:PayGroup>
</pi:Payroll_Extract_Employees>` 

以下是我尝试过的示例xslt代码,但它似乎是为代码中的特定时间添加了所有数量

   <xsl:choose>
                                        <xsl:when test="pi:Position/pi:Total_Annual_Base_Pay[exists(@pi:PriorValue)]
                                            or pi:Position/pi:Compensation_Effective_Date[exists(@pi:PriorValue)]          ">
                                          <xsl:if test="pi:Time_Off[pi:Code='CHN_PERSONAL_PLAN']/pi:Time_Off_Date &lt; pi:Position[pi:Operation!='REMOVE']/pi:Compensation_Effective_Date ">         
                                                <xsl:value-of
                                                    select="sum(pi:Time_Off[pi:Code='CHN_PERSONAL_PLAN']/pi:Quantity)
                                                    + sum(pi:Time_Off_Correction[pi:Code='CHN_PERSONAL_PLAN']/pi:Quantity)"
                                                />
                                            </xsl:if>
                                        </xsl:when>
                                    <!--   <xsl:otherwise>
                                         <xsl:value-of
                                             select="sum(pi:Time_Off[pi:Code='CHN_PERSONAL_PLAN']/pi:Quantity)
                                             + sum(pi:Time_Off_Correction[pi:Code='CHN_PERSONAL_PLAN']/pi:Quantity)"
                                         />
                                     </xsl:otherwise>-->
                                    </xsl:choose> 

1 个答案:

答案 0 :(得分:1)

  

每当时间偏差小于补偿生效日期加   数量值为36

我相信这符合规定的条件:

XSLT 1.0

<xsl:stylesheet version="1.0" 
xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
xmlns:pi="urn:com.workday/picof"
exclude-result-prefixes="pi">
<xsl:output method="xml" version="1.0" encoding="UTF-8" indent="yes"/>
<xsl:strip-space elements="*"/>

<xsl:template match="/pi:Payroll_Extract_Employees">
    <result>
        <xsl:value-of select="sum(pi:PayGroup/pi:Employee/pi:Time_Off[pi:Time_Off_Date &lt; ancestor::pi:Employee/pi:Position/pi:Compensation_Effective_Date]/pi:Quantity)"/>
    </result>
</xsl:template>

</xsl:stylesheet>

但是,当应用于输入示例时,结果为24,而不是36。