xsl-list
[Top] [All Lists]

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

2006-07-12 05:35:42
Cool.
 -------------- 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>
--~--