[XSL-LIST Mailing List Archive Home]
[By Thread]
[By Date]
[xsl] Re: Help cleaning up this 1.0 gem
Subject: [xsl] Re: Help cleaning up this 1.0 gem From: Steve <subsume@xxxxxxxxx> Date: Fri, 5 Oct 2007 15:41:02 -0400 |
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 > 0 and $test <= $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 |
---|
|
<- Previous | Index | Next -> |
---|---|---|
[xsl] Help cleaning up this 1.0 gem, Steve | Thread | Re: [xsl] Help cleaning up this 1.0, David Carlisle |
[xsl] Help cleaning up this 1.0 gem, Steve | Date | Re: [xsl] New markup conference, Wendell Piez |
Month |