2016-12-05 4 views
0

Мне нужна помощь в добавлении количества с помощью кода xslt - всякий раз, когда дате окончания времени меньше, чем срок действия компенсации, добавьте значения количества, которые были бы ниже в примере ниже.Как сделать сумму из xml на основе условия с использованием кода xslt

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

всякий раз, когда время от даты меньше компенсации даты вступления в силу добавить значения количества, которое было бы 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.

+0

Привет Майкл, спасибо за ответ, еще один вопрос, как я могу добавить конкретные кодовое имя этого условия, в моем примере было все время от имени «CHN_PERSONAL_PLAN», но в реальном сценарии у меня будет более одного названия плана времени, поэтому мне нужно ограничить сумму на основе кодового имени [pi: Code = CHN_PERSONAL_PLAN '] и сопоставление дат вместе. Я буду благодарен за ваш совет. – Abhi

+0

Вы можете просто добавить это как другой предикат, то есть 'pi: Time_Off [pi: Code = 'CHN_PERSONAL_PLAN'] [pi: Time_Off_Date < ancestor :: pi: Employee/pi: Position/pi: Compensation_Effective_Date]' , Или объедините их как 'pi: Time_Off [pi: Code = 'CHN_PERSONAL_PLAN' и pi: Time_Off_Date < ancestor :: pi: Employee/pi: Position/pi: Compensation_Effective_Date]'. –

+0

@Abhi Если на ваш вопрос ответили, пожалуйста, закройте его, приняв ответ. –