2012-12-22 61 views
1

在使用xslt 1.0進行轉換時,我發現有點難以實現以下邏輯。 這是我的要求: 我需要定義一個員工工作小時的以下邏輯。 1.超過8的任何東西都是OT,否則在一天中定期。 2.如果連續工作3天,那麼第三天的工作時間將是雙倍時間。在xslt 1.0轉換中實現有點棘手的邏輯

下面是一個例子:

輸入:

<Input> 
      <Record> 
      <EmpId>1</EmpId> 
      <Date></Date> 
      <Hours></Hours> 
      </Record> 
      <Record> 
      <EmpId>1</EmpId> 
      <Date>12/1/2012</Date> 
      <Hours>6</Hours> 
      </Record> 
      <Record> 
      <EmpId>1</EmpId> 
      <Date>12/1/2012</Date> 
      <Hours>4</Hours> 
      </Record> 
      <Record> 
      <EmpId>1</EmpId> 
      <Date>12/2/2012</Date> 
      <Hours>4</Hours> 
      </Record> 
      <Record> 
      <EmpId>1</EmpId> 
      <Date>12/2/2012</Date> 
      <Hours></Hours> 
      </Record> 
      <Record> 
      <EmpId>1</EmpId> 
      <Date>12/3/2012</Date> 
      <Hours>3</Hours> 
      </Record> 
      <Record> 
      <EmpId>2</EmpId> 
      <Date>12/1/2012</Date> 
      <Hours>4</Hours> 
      </Record> 
      <Record> 
      <EmpId>2</EmpId> 
      <Date>12/1/2012</Date> 
      <Hours></Hours> 
      </Record> 
     </Input> 

輸出:

<Output> 
      <Record> 
      <EmployeeId>1</EmployeeId> 
      <Detail> 
       <Date>12/1/2012</Date> 
       <RegHours>8</Reghours> 
       <OTHours>2</OTHours> 
      </Detail> 
      <Detail> 
       <Date>12/2/2012</Date> 
       <RegHours>4</Reghours> 
      </Detail> 
      <Detail> 
       <Date>12/3/2012</Date> 
       <DTHours>3</DThours> 
      </Detail> 
      </Record> 
      <Record> 
      <EmployeeId>2</EmployeeId> 
      <Detail> 
       <Date>12/1/2012</Date> 
       <RegHours>4</Reghours> 
      </Detail> 
      <Detail> 
      </Record> 
    </Output> 

將不勝感激的任何幫助。

謝謝.. ABHI

+0

ohh對不起!!!新來這個論壇的人不知道這個過程。已經接受了答案。現在,我會照顧到這一點。請幫我擺脫這個問題。 – user1905354

回答

0

這種轉變

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

<xsl:key name="kRecByEmpId" match="Record[Date/node() and Hours/node()]" 
      use="EmpId"/> 
<xsl:key name="kRecByEmpIdDate" match="Record[Date/node() and Hours/node()]" 
      use="concat(EmpId,'+',Date)"/> 

<xsl:template match= 
    "Record[generate-id()=generate-id(key('kRecByEmpId',EmpId)[1])]"> 
    <Record> 
    <EmployeeId> 
     <xsl:value-of select="EmpId"/> 
    </EmployeeId> 
    <xsl:apply-templates mode="datetime" select= 
     "key('kRecByEmpId', EmpId) 
       [generate-id() 
       = 
       generate-id(key('kRecByEmpIdDate', 
           concat(EmpId,'+',Date) 
           )[1] 
         ) 
      ] 
     "/> 
    </Record> 
    </xsl:template> 

    <xsl:template match="Record" mode="datetime"> 
    <Detail> 
     <xsl:copy-of select="Date"/> 
     <xsl:variable name="vTotal" select= 
     "sum(key('kRecByEmpIdDate', concat(EmpId,'+',Date))/Hours)"/> 
     <RegHours> 
     <xsl:value-of select="8*($vTotal >= 8) + $vTotal*(not($vTotal >= 8))"/> 
     </RegHours> 
     <xsl:if test="$vTotal > 8"> 
      <OTHours> 
      <xsl:value-of select="$vTotal -8"/> 
      </OTHours> 
     </xsl:if> 
    </Detail> 
    </xsl:template> 
    <xsl:template match="text()"/> 
</xsl:stylesheet> 

時所提供的XML文檔應用:

<Input> 
    <Record> 
     <EmpId>1</EmpId> 
     <Date></Date> 
     <Hours></Hours> 
    </Record> 
    <Record> 
     <EmpId>1</EmpId> 
     <Date>12/1/2012</Date> 
     <Hours>6</Hours> 
    </Record> 
    <Record> 
     <EmpId>1</EmpId> 
     <Date>12/1/2012</Date> 
     <Hours>4</Hours> 
    </Record> 
    <Record> 
     <EmpId>1</EmpId> 
     <Date>12/2/2012</Date> 
     <Hours>4</Hours> 
    </Record> 
    <Record> 
     <EmpId>1</EmpId> 
     <Date>12/2/2012</Date> 
     <Hours></Hours> 
    </Record> 
    <Record> 
     <EmpId>1</EmpId> 
     <Date>12/3/2012</Date> 
     <Hours>3</Hours> 
    </Record> 
    <Record> 
     <EmpId>2</EmpId> 
     <Date>12/1/2012</Date> 
     <Hours>4</Hours> 
    </Record> 
    <Record> 
     <EmpId>2</EmpId> 
     <Date>12/1/2012</Date> 
     <Hours></Hours> 
    </Record> 
</Input> 

產生想要的,正確的結果

<Record> 
    <EmployeeId>1</EmployeeId> 
    <Detail> 
     <Date>12/1/2012</Date> 
     <RegHours>8</RegHours> 
     <OTHours>2</OTHours> 
    </Detail> 
    <Detail> 
     <Date>12/2/2012</Date> 
     <RegHours>4</RegHours> 
    </Detail> 
    <Detail> 
     <Date>12/3/2012</Date> 
     <RegHours>3</RegHours> 
    </Detail> 
</Record> 
<Record> 
    <EmployeeId>2</EmployeeId> 
    <Detail> 
     <Date>12/1/2012</Date> 
     <RegHours>4</RegHours> 
    </Detail> 
</Record> 
+0

我也需要實現邏輯2.如果連續工作了3天,那麼第三天的工作時間就是雙倍工作時間。 – user1905354

+0

@ user1905354,請編輯*問題並更正提供的通緝結果。現在它不顯示第三天小時翻倍。另外,將這個問題分解爲兩個問題是一個好主意,第二個要求作爲一個單獨的問題。請注意,XSLT 1.0沒有標準的日期,時間和持續時間功能。第二個要求可以使用XSLT 2.0 –

+0

在第三天的輸出中輕鬆實現...請查看節點。我不能使用xslt 2.0。請幫我解決大麻煩。 – user1905354