2015-04-17 2 views
0

Привет Я относительно новым для XSLT (используется для процедурных языков программирования), но найти его трудно понять, как я могу добиться этого в XSLT и признателен за любую помощь:Поиск годовой заработной платы работников в XSLT

XML-, Я хочу преобразовать следующее - это не что иное, как перечисление сотрудников с ежемесячными изменениями зарплаты. Цель состоит в том, чтобы определить годовую зарплату на 2015 год

<employees> 

     <employee> 
      <id>E1</id> 
      <hiredt>2000-01-01</hiredt> 
      <salaryhistory> 
       <change> 
        <efffrom>2000-01-01</efffrom> 
        <monthlypay>4000</monthlypay> 
       </change> 
       <change> 
        <efffrom>2014-01-01</efffrom> 
        <monthlypay>5000</monthlypay> 
       </change> 
       <change> 
        <efffrom>2015-02-01</efffrom> 
        <monthlypay>6000</monthlypay> 
       </change> 
       <change> 
        <efffrom>2015-07-01</efffrom> 
        <monthlypay>7000</monthlypay> 
       </change> 
      </salaryhistory> 
     </employee> 
     <employee> 
      <id>E2</id> 
      <hiredt>2015-03-01</hiredt>  
      <salaryhistory> 
       <change> 
        <efffrom>2015-03-01</efffrom> 
        <monthlypay>5000</monthlypay> 
       </change> 
      </salaryhistory> 
     </employee> 

    </employees> 

цель состоит в том, чтобы вычислить годовую зарплату для всех сотрудников к 2015 году и преобразованию в следующем документ XML

 <employees> 

     <employee> 
      <id>E1</id> 
      <annualsal>77000</annualsal> 
     </employee> 

     <employee> 
      <id>E2</id> 
      <annualsal>50000</annualsal> 
     </employee>  

    </employees> 

Объяснения на вычислениях.

Computation for E1 
5000 * 1 month = 5000 
6000 * 5 months = 30000 
7000 * 6 months = 42000 
Total     77000 

Исчисление для E2

5000 * 10 months = 50,000 employee started on March 1,2015. 

Любое руководство будет высоко ценится.

+0

Могут ли изменения произойти в любой день года или только в первый день любого месяца? –

+0

Да, на самом деле это возможно. Пока я хотел начать с чего-то простого. Но обычно на даты сертификатов. Когда начинается период оплаты. Оплата производится раз в две недели – StillStumbling

ответ

0

Там может быть более элегантный способ, но это works:

XSLT 2,0

<xsl:stylesheet version="2.0" 
xmlns:xsl="http://www.w3.org/1999/XSL/Transform" 
xmlns:xs="http://www.w3.org/2001/XMLSchema" 
exclude-result-prefixes="xs"> 
<xsl:output method="xml" version="1.0" encoding="utf-8" indent="yes"/> 

<xsl:param name="year" select="2015"/> 

<xsl:variable name="months" as="xs:date*"> 
    <xsl:for-each select="1 to 12"> 
     <xsl:sequence select="xs:date(concat($year, format-number(., '-00'), '-01'))"/> 
    </xsl:for-each> 
</xsl:variable> 

<xsl:template match="/employees"> 
    <xsl:copy> 
     <xsl:apply-templates select="employee"/> 
    </xsl:copy> 
</xsl:template> 

<xsl:template match="employee"> 
    <xsl:copy> 
     <xsl:copy-of select="id"/> 
     <xsl:variable name="salary-changes" select="salaryhistory/change" /> 
     <xsl:variable name="salaries-by-month" as="xs:integer*"> 
      <xsl:for-each select="$months"> 
       <xsl:sequence select="$salary-changes[xs:date(efffrom) le current()][last()]/monthlypay" /> 
      </xsl:for-each> 
     </xsl:variable> 
     <annualsal> 
      <xsl:value-of select="sum($salaries-by-month)" /> 
     </annualsal> 
    </xsl:copy> 
</xsl:template> 

</xsl:stylesheet> 

Обратите внимание, что изменения заработной платы, как предполагается, должны быть перечислены в хронологическом порядке.

+0

Майкл, Спасибо за ваш ответ. Я бы никогда не подумал сделать что-то подобное: – StillStumbling

+0

Майкл, Спасибо за ваш ответ. Я бы никогда не подумал о том, чтобы сделать что-то вроде этого - я думал больше о том, как искать следующий эффективный датированный ряд, а затем вычислять сумму. Можете ли вы объяснить это утверждение - StillStumbling

+0

«Вы можете объяснить это утверждение -