[XSL-LIST Mailing List Archive Home] [By Thread] [By Date] [Recent Entries] [Reply To This Message]

Re: Help cleaning up this 1.0 gem

Subject: Re: Help cleaning up this 1.0 gem
From: Steve <subsume@xxxxxxxxx>
Date: Fri, 5 Oct 2007 15:41:02 -0400
 Re: Help cleaning up this 1.0 gem
Forgot the output.

Service 	|All 	|A 	|B 	|C 	|Other
Service 1 	|30.25 	|6.5 	|1.5 	|2.75 	|19.5
Service 2 	|150.75 |32.25 	|7.25 	|14.5 	|96.75
Service 3 	|2.25 	|0.25 	|0 	|0 	|2
Service 4 	|50.25 	|11 	|2.5 	|5 	|31.75
Service 5 	|25	|0	|0	|0	|25
			...

Total 		|851.75 |155.25 |35 	|69 	|554.5

On 10/5/07, Steve <subsume@xxxxxxxxx> wrote:
>  In general, my company provides services and we get credit up to a
> certain quota from the funding sources (A, B, C, OTHER).
>
> I'm simply looking for suggestions to simplify this template in order
> to a) increase maintainability b) solve some minor externalities.
>
> Because we report to the nearest quarter hour, I had to pass the
> difference because, after several recursive rounds of the below
> template, the small bit rounded off adds up to significant
> discrepencies with the original, unrounded, total. However, I'm still
> finding that the total ($XshouldBe) is different than the recursive
> total generated (by a quarter-hour).
>
> Template can also be passed a Record/Activity but that can be ignored here.
>
> $services variable goes like:
> <records>
>  <Record>
>     <service>Service n</service>
>     <hours>123</hours>
>   </Record>
> </records>
>
> <xsl:template select="/">
>         <xsl:apply-templates select="$services[1]">
>                 <xsl:with-param name="AshouldBe" select="$Atotal" />
>                 <xsl:with-param name="BshouldBe" select="$Btotal" />
>                 <xsl:with-param name="CshouldBe" select="$Ctotal" />
>
>                <!-- below WF = "Without (funding source) Five". Since
> its hours don't count -->
>
>                 <xsl:with-param name="Aratio" select="$SSAtotal div $totalWF" />
>                 <xsl:with-param name="Bratio" select="$partBtotal div $totalWF" />
>                 <xsl:with-param name="Cratio" select="$Ctotal div $totalWF" />
>                 <xsl:with-param name="OTHERratio" select="($totalWF - ( $Atotal +
> $Btotal + $Ctotal ) )  div $totalWF" />
>         </xsl:apply-templates>
> </xsl:template>
> <xsl:template match="Record">
>         <xsl:param name="AshouldBe" />
>         <xsl:param name="BshouldBe" />
>         <xsl:param name="CshouldBe" />
>
>         <!-- below 't' suffix = 'total' -->
>
>         <xsl:param name="Allt">0</xsl:param>
>         <xsl:param name="At">0</xsl:param>
>         <xsl:param name="Ct">0</xsl:param>
>         <xsl:param name="Bt">0</xsl:param>
>         <xsl:param name="OTHERt">0</xsl:param>
>
>         <!-- ratio - percent of hours allocated to each funding source -->
>
>         <xsl:param name="Aratio"        />
>         <xsl:param name="Bratio"        />
>         <xsl:param name="Cratio"        />
>         <xsl:param name="OTHERratio"    />
>
>         <!-- differences -->
>
>         <xsl:param name="Adiff">0</xsl:param>
>         <xsl:param name="Bdiff">0</xsl:param>
>         <xsl:param name="Cdiff">0</xsl:param>
>
>         <!-- needed because when service = 5, no allocation comes from
> A,B, or C. -->
>         <xsl:variable name="i_A">
>                 <xsl:choose>
>                         <xsl:when test="not(service) or service != 'Service
> 5"><xsl:value-of select="$Aratio" /></xsl:when>
>                         <xsl:otherwise>0</xsl:otherwise>
>                 </xsl:choose>
>         </xsl:variable>
>         <xsl:variable name="i_B">
>                 <xsl:choose>
>                         <xsl:when test="not(service) or service != 'Service
> 5'"><xsl:value-of select="$Bratio" /></xsl:when>
>                         <xsl:otherwise>0</xsl:otherwise>
>                 </xsl:choose>
>         </xsl:variable>
>         <xsl:variable name="i_C">
>                 <xsl:choose>
>                         <xsl:when test="not(service) or service != 'Service
> 5'"><xsl:value-of select="$Cratio" /></xsl:when>
>                         <xsl:otherwise>0</xsl:otherwise>
>                 </xsl:choose>
>         </xsl:variable>
>         <xsl:variable name="i_OTHER">
>                 <xsl:choose>
>                         <xsl:when test="not(service) or service != 'Service
> 5'"><xsl:value-of select="$OTHERratio" /></xsl:when>
>                         <xsl:otherwise>1</xsl:otherwise>
>                 </xsl:choose>
>         </xsl:variable>
>         <xsl:variable name="All" select="round(hours * 4) div 4" />
>
>        <!-- 'wo' = without. As in, without any correction for the
> differences -->
>
>         <xsl:variable name="Awo">
>                 <xsl:value-of select="$i_A * hours" />
>         </xsl:variable>
>         <xsl:variable name="Bwo">
>                 <xsl:value-of select="$i_B * hours" />
>         </xsl:variable>
>         <xsl:variable name="Cwo">
>                 <xsl:value-of select="$i_C * hours" />
>         </xsl:variable>
>
>       <!-- funding sources with the differential factored -->
>
>         <xsl:variable name="A">
>                 <xsl:choose>
>                         <xsl:when test="$i_A != 0 and round( ( $Awo + $Adiff ) * 4) div 4 > 0">
>                                 <xsl:value-of select="round( ( $Awo + $Adiff ) * 4) div 4" />
>                         </xsl:when>
>                         <xsl:otherwise>0</xsl:otherwise>
>                 </xsl:choose>
>         </xsl:variable>
>         <xsl:variable name="B">
>                 <xsl:choose>
>                         <xsl:when test="$i_B != 0 and round( ( $Bwo + $Bdiff ) * 4) div 4 > 0">
>                                 <xsl:value-of select="round( ( $Bwo + $Bdiff ) * 4) div 4" />
>                         </xsl:when>
>                         <xsl:otherwise>0</xsl:otherwise>
>                 </xsl:choose>
>         </xsl:variable>
>         <xsl:variable name="C">
>                 <xsl:variable name="test" select="round( ( $Cwo + $Cdiff ) * 4) div 4" />
>                 <xsl:choose>
>                         <xsl:when test="$i_C != 0 and $test &gt; 0 and $test &lt;= $All">
>                                 <xsl:value-of select="$test" />
>                         </xsl:when>
>                         <xsl:when test="$test > $All">
>                                 <xsl:value-of select="$All" />
>                         </xsl:when>
>                         <xsl:otherwise>0</xsl:otherwise>
>                 </xsl:choose>
>         </xsl:variable>
>         <xsl:variable name="OTHER">
>                 <xsl:choose>
>                         <xsl:when test="round($OTHERratio * hours * 4) div 4 > 0" >
>                                 <xsl:value-of select="round($OTHERratio * hours * 4) div 4" />
>                         </xsl:when>
>                         <xsl:otherwise>
>                                 0
>                         </xsl:otherwise>
>                 </xsl:choose>
>         </xsl:variable>
>         <tr>
>                 <td class="left">
>                         <xsl:choose>
>                                 <xsl:when test="service">
>                                           <xsl:value-of select="service" />
>                                 </xsl:when>
>                                 <xsl:otherwise>
>                                          <xsl:value-of select="activity" />
>                                 </xsl:otherwise>
>                         </xsl:choose>
>                 </td>
>                 <td><xsl:value-of select="$All" /></td>
>                 <td><xsl:value-of select="$A" /></td>
>                 <td><xsl:value-of select="$B" /></td>
>                 <td><xsl:value-of select="$C" /></td>
>                 <td><xsl:value-of select="$OTHER + ($All - $A - $B - $OTHER - $C)" /></td>
>         </tr>
>         <xsl:choose>
>                 <xsl:when test="following-sibling::Record[1]">
>                         <xsl:apply-templates select="following-sibling::Record[1]">
>                                 <xsl:with-param name="AshouldBe" select="$AshouldBe" />
>                                 <xsl:with-param name="BshouldBe" select="$BshouldBe" />
>                                 <xsl:with-param name="CshouldBe" select="$CshouldBe" />
>                                 <xsl:with-param name="Aratio" select="$Aratio" />
>                                 <xsl:with-param name="Bratio" select="$Bratio" />
>                                 <xsl:with-param name="Cratio" select="$Cratio" />
>                                 <xsl:with-param name="OTHERratio" select="$OTHERratio" />
>                                 <xsl:with-param name="Adiff">
>                                         <xsl:choose>
>                                                 <xsl:when test="$i_A = 0">
>                                                         <xsl:value-of select="$Adiff" />
>                                                 </xsl:when>
>                                                 <xsl:otherwise>
>                                                         <xsl:choose>
>                                                                 <xsl:when test="$A = round( $Awo * 4 ) div 4">
>                                                                         <xsl:value-of select="($Adiff + $Awo) - $A" />
>                                                                 </xsl:when>
>                                                                 <xsl:otherwise>
>                                                                         <xsl:value-of select="$Awo - $A" />
>                                                                 </xsl:otherwise>
>                                                         </xsl:choose>
>                                                 </xsl:otherwise>
>                                         </xsl:choose>
>                                 </xsl:with-param>
>                                 <xsl:with-param name="Cdiff">
>                                         <xsl:choose>
>                                                 <xsl:when test="$i_C = 0">
>                                                         <xsl:value-of select="$Cdiff" />
>                                                 </xsl:when>
>                                                 <xsl:otherwise>
>                                                         <xsl:choose>
>                                                                 <xsl:when test="$C = round( $Cwo * 4 ) div 4">
>                                                                         <xsl:value-of select="($Cdiff + $Cwo) - $C" />
>                                                                 </xsl:when>
>                                                                 <xsl:otherwise>
>                                                                         <xsl:value-of select="$Cwo - $C" />
>                                                                 </xsl:otherwise>
>                                                         </xsl:choose>
>                                                 </xsl:otherwise>
>                                         </xsl:choose>
>                                 </xsl:with-param>
>                                 <xsl:with-param name="Bdiff">
>                                         <xsl:choose>
>                                                 <xsl:when test="$i_B = 0">
>                                                         <xsl:value-of select="$Bdiff" />
>                                                 </xsl:when>
>                                                 <xsl:otherwise>
>                                                         <xsl:choose>
>                                                                 <xsl:when test="$B = round( $Bwo * 4 ) div 4">
>                                                                         <xsl:value-of select="($Bdiff + $Bwo) - $B" />
>                                                                 </xsl:when>
>                                                                 <xsl:otherwise>
>                                                                         <xsl:value-of select="$Bwo - $B" />
>                                                                 </xsl:otherwise>
>                                                         </xsl:choose>
>                                                 </xsl:otherwise>
>                                         </xsl:choose>
>                                 </xsl:with-param>
>                                 <xsl:with-param name="Allt" select="$Allt + $All"/>
>                                 <xsl:with-param name="At" select="$At + $A"/>
>                                 <xsl:with-param name="Bt" select="$Bt + $B"/>
>                                 <xsl:with-param name="Ct" select="$Ct + $C"/>
>                                 <xsl:with-param name="OTHERt" select="$OTHERt + $OTHER"/>
>                         </xsl:apply-templates>
>                 </xsl:when>
>                 <xsl:otherwise>
>                         <tr>
>                                 <td style="text-align:right">Total</td>
>                                 <td><xsl:value-of select="$Allt + $All" /></td>
>                                 <td>
>                                         <xsl:value-of select="$At + $A" />
>                                         <xsl:if test="$At + $A != $AshouldBe"><font color="red"
> class="screen">(<xsl:value-of select="$At + $A -
> $AshouldBe"/>)</font></xsl:if>
>                                 </td>
>                                 <td>
>                                         <xsl:value-of select="$Bt + $B" />
>                                         <xsl:if test="$Bt + $B != $BshouldBe"><font color="red"
> class="screen">(<xsl:value-of select="$Bt + $B -
> $BshouldBe"/>)</font></xsl:if>
>                                 </td>
>                                 <td>
>                                         <xsl:value-of select="$Ct + $C" />
>                                         <xsl:if test="$Ct + $C != $CshouldBe"><font color="red"
> class="screen">(<xsl:value-of select="$Ct + $C -
> $CshouldBe"/>)</font></xsl:if>
>                                 </td>
>                                 <td><xsl:value-of select="$OTHERt + ($All - $A - $B - $OTHER - $C)
> + ($Allt - $At - $Bt - $OTHERt - $Ct)" /></td>
>                         </tr>
>                 </xsl:otherwise>
>         </xsl:choose>
> </xsl:template>

Current Thread

PURCHASE STYLUS STUDIO ONLINE TODAY!

Purchasing Stylus Studio from our online shop is Easy, Secure and Value Priced!

Buy Stylus Studio Now

Download The World's Best XML IDE!

Accelerate XML development with our award-winning XML IDE - Download a free trial today!

Don't miss another message! Subscribe to this list today.
Email
First Name
Last Name
Company
Subscribe in XML format
RSS 2.0
Atom 0.3
Site Map | Privacy Policy | Terms of Use | Trademarks
Free Stylus Studio XML Training:
W3C Member
Stylus Studio® and DataDirect XQuery ™are products from DataDirect Technologies, is a registered trademark of Progress Software Corporation, in the U.S. and other countries. © 2004-2013 All Rights Reserved.