Subject: Re: [xsl] Keeping a running total? (Redo) From: didoss@xxxxxxxxxxx Date: Wed, 12 Jul 2006 12:35:08 +0000 |
Cool. -------------- Original message ---------------------- From: "Dimitre Novatchev" <dnovatchev@xxxxxxxxx> > Here's one possible solution: > > This transformation: > > <xsl:stylesheet version="2.0" > xmlns:xsl="http://www.w3.org/1999/XSL/Transform" > xmlns:xs="http://www.w3.org/2001/XMLSchema" > xmlns:f="http://fxsl.sf.net/" > exclude-result-prefixes="f xs" > > > <xsl:import href="../f/func-scanl.xsl"/> > <xsl:import href="../f/func-Operators.xsl"/> > <xsl:import href="../f/func-map.xsl"/> > > <!-- To be run against: ..\data\testFunc-Scanl2.xml --> > > <xsl:output omit-xml-declaration="yes" indent="yes"/> > > <xsl:param name="prunQuatas" as="element()+"> > <q name="widgets" min="1" max="8"/> > <q name="gadgets" min="9" max="13"/> > <q name="excess" min="14" max="999999999"/> > </xsl:param> > > <xsl:template match="/"> > <xsl:variable name="vFactories" as="element()+" > select="/*/*"/> > > <xsl:variable name="vrunTotals" as="xs:double+" > select="f:scanl(f:add(), 0, $vFactories/@capacity)"/> > > <xsl:variable name="vMinInSeq" as="xs:double+" select= > "f:map(f:add(1), $vrunTotals)" > /> > > <xsl:variable name="vMaxInSeq" as="xs:double+" select= > "remove($vrunTotals,1), 999999999" > /> > > <xsl:sequence select= > "for $ind in 1 to count($vFactories) > return > f:breakDownElement($ind,$vFactories, > $vMinInSeq, $vMaxInSeq, > $prunQuatas > ) > " > /> > </xsl:template> > > <xsl:function name="f:breakDownElement" as="element()"> > <xsl:param name="pInd" as="xs:integer"/> > <xsl:param name="pFactories" as="element()+"/> > <xsl:param name="pMinInSeq" as="xs:double+"/> > <xsl:param name="pMaxInSeq" as="xs:double+"/> > <xsl:param name="prunQuatas" as="element()+"/> > > <xsl:variable name="pFctry" select="$pFactories[$pInd]"/> > > <xsl:element name="{name($pFctry)}"> > <xsl:copy-of select="$pFctry/@*"/> > <xsl:sequence select= > "f:breakDown($pInd, $pMinInSeq, $pMaxInSeq, $prunQuatas)"/> > </xsl:element> > </xsl:function> > > <xsl:function name="f:breakDown"> > <xsl:param name="pInd" as="xs:integer"/> > <xsl:param name="pMinInSeq" as="xs:double+"/> > <xsl:param name="pMaxInSeq" as="xs:double+"/> > <xsl:param name="prunQuatas" as="element()+"/> > > <xsl:variable name="vMin" as="xs:double" > select="$pMinInSeq[$pInd]"/> > > <xsl:variable name="vMax" as="xs:double" > select="$pMaxInSeq[$pInd]"/> > > <xsl:for-each select= > "$prunQuatas[not($vMin > @max or @min > $vMax)]"> > > <xsl:attribute name="{@name}" select= > "min(($vMax, @max)) - max(($vMin, @min)) +1"/> > </xsl:for-each> > </xsl:function> > </xsl:stylesheet> > > > when applied on this xml document > > <xml> > <factory x="A" capacity = "3" /> > <factory x="B" capacity= "6" /> > <factory x="C" capacity = "3" /> > <factory x="D" capacity = "2" /> > <factory x="E" capacity = "2" /> > ...etc... > </xml> > > produces the wanted result: > > <factory x="A" capacity="3" widgets="3"/> > <factory x="B" capacity="6" widgets="5" gadgets="1"/> > <factory x="C" capacity="3" gadgets="3"/> > <factory x="D" capacity="2" gadgets="1" excess="1"/> > <factory x="E" capacity="2" excess="2"/> > > -- > Cheers, > Dimitre Novatchev > --------------------------------------- > Truly great madness cannot be achieved without significant intelligence. > > > On 7/11/06, didoss@xxxxxxxxxxx <didoss@xxxxxxxxxxx> wrote: > > I would think that the intended output would be: > > > > Factory A produces 3 widgets; > > Factory B produces 5 widgets and 1 gadget; > > Factory C produces 3 gadgets; > > Factory D produces 1 gadget and 1 excess product - whatever that is; > > Factory E and beyond produce excess products. > > > > So, you are really trying to keep track of 2 changing numbers,...the number of > current product still required, as well as the capacity of the factory. When > the number of the current product required gets to zero, you change products - > gotta figure out how to prioritize those. When the capacity of the current > factory gets to zero (has been fully allocated), you change factories - which > would be controlled by the order of the input xml, I assume. > > > > So, is it better to do this incrementally - subtract one from required and one > from remaining capacity,...or to do bulk comparisons - I need to build 8, but > can only build 3, so give all three to Factory 1, and subtract 3 from > WidgetRequirement, then I still need to build 5, but Factory B can build 6, so > subtract all 5 from the WidgetRequirement and the CurrentCapacity and then > figure out what to do with the remaining CurrentCapacity for Factory B. > > > > > > Dianne > > > > -------------- Original message ---------------------- > > From: "Dimitre Novatchev" <dnovatchev@xxxxxxxxx> > > > The presented source xml file is not too representative because the > > > total capacity of the first two factories is exactly the widget quota. > > > > > > What should be the output in case the capacity for factory B was 6? > > > > > > > > > On 7/11/06, Steve <subsume@xxxxxxxxx> wrote: > > > > Previous thread has degenerated into confusion. Let's try again. > > > > > > > > ----- Source XML > > > > <xml> > > > > <factory x="A" capacity = "3" /> > > > > <factory x="B" capacity= "5" /> > > > > <factory x="C" capacity = "3" /> > > > > <factory x="D" capacity = "2" /> > > > > <factory x="E" capacity = "2" /> > > > > ...etc... > > > > </xml> > > > > > > > > $Widget_quota = "8" > > > > $Gadget_quota = "5" > > > > > > > > ----- Goal: an output table like below. > > > > > > > > Factory | Widgets | Gadgets | Excess > > > > > > > > A | 3 > > > > B | 5 > > > > <!-- *Click. Widget Quota has been reached. Switch to gadgets* > --> > > > > C | 3 > > > > D | 2 > > > > <!-- *Click. Omg. Gadget Quota has been reached. Switch to > Excess* > > > --> > > > > E | etc. > > > > F | etc. > > > > G | etc. > > > > H | etc. > > > > > > > > ---- > > > > Howto? > > > > > > > > M.K. Suggested > > > > http://www.biglist.com/lists/xsl-list/archives/200607/msg00191.html > > > > but my question (Howto?) remains. > > > > > > > > Thanks, > > > > > > > > -Steve > > > > > > > > > > > > > > > > > -- > > > Cheers, > > > Dimitre Novatchev > > > --------------------------------------- > > > Truly great madness cannot be achieved without significant intelligence.
Current Thread |
---|
|
<- Previous | Index | Next -> |
---|---|---|
Re: [xsl] Keeping a running total? , Dimitre Novatchev | Thread | Re: [xsl] Keeping a running total? , didoss |
[xsl] Re: [XSL] XSLT Unit Testing (, Florent Georges | Date | Re: [xsl] Keeping a running total? , didoss |
Month |