xsl-list
[Top] [All Lists]

Re: [xsl] Keeping a running total? (Redo)

2006-07-12 05:49:44
Extra credit -

1) Could you make it even more flexible,...provide the product quotas 
("prunQuatas") as another input file, so that it vary by cycle, without have to 
change the transform file,..."this quarter we have this list of available 
factories with associated capacities, and this other list of products that we 
need to produce for the quarter, so how do we go about distributing the load."  
Maybe the product input file provides a priority and quota, and gets converted 
to the "prunQuatas" param block that is below?

2) As a separate track, looking from a more industrial engineering side of 
things,...assuming that there is some loss associated with having to produce 
multiple products at a facility,...could you write a transform that would 
optimize a list of factories, such that order might be changed in order to 
optimize production - maybe it makes more sense to let C and D pick up the 
remaining widgets, instead of splitting up production at B and D,...if I'm 
making myself clear here.  :) 

Of course, all of this is just having fun with "how far can we take this - what 
can the technology handle",...the OP might not have any need for this 
functionality.  I just enjoy thinking about it.


Dianne

 -------------- Original message ----------------------
From: "Dimitre Novatchev" <dnovatchev(_at_)gmail(_dot_)com>
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="{(_at_)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(_at_)comcast(_dot_)net <didoss(_at_)comcast(_dot_)net> 
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(_at_)gmail(_dot_)com>
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(_at_)gmail(_dot_)com> 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

--~------------------------------------------------------------------
XSL-List info and archive:  http://www.mulberrytech.com/xsl/xsl-list
To unsubscribe, go to: http://lists.mulberrytech.com/xsl-list/
or e-mail: 
<mailto:xsl-list-unsubscribe(_at_)lists(_dot_)mulberrytech(_dot_)com>
--~--




--
Cheers,
Dimitre Novatchev
---------------------------------------
Truly great madness cannot be achieved without significant intelligence.

--~------------------------------------------------------------------
XSL-List info and archive:  http://www.mulberrytech.com/xsl/xsl-list
To unsubscribe, go to: http://lists.mulberrytech.com/xsl-list/
or e-mail: 
<mailto:xsl-list-unsubscribe(_at_)lists(_dot_)mulberrytech(_dot_)com>
--~--




--~------------------------------------------------------------------
XSL-List info and archive:  http://www.mulberrytech.com/xsl/xsl-list
To unsubscribe, go to: http://lists.mulberrytech.com/xsl-list/
or e-mail: 
<mailto:xsl-list-unsubscribe(_at_)lists(_dot_)mulberrytech(_dot_)com>
--~--



--~------------------------------------------------------------------
XSL-List info and archive:  http://www.mulberrytech.com/xsl/xsl-list
To unsubscribe, go to: http://lists.mulberrytech.com/xsl-list/
or e-mail: 
<mailto:xsl-list-unsubscribe(_at_)lists(_dot_)mulberrytech(_dot_)com>
--~--




--~------------------------------------------------------------------
XSL-List info and archive:  http://www.mulberrytech.com/xsl/xsl-list
To unsubscribe, go to: http://lists.mulberrytech.com/xsl-list/
or e-mail: <mailto:xsl-list-unsubscribe(_at_)lists(_dot_)mulberrytech(_dot_)com>
--~--