Subject: Re: [xsl] How to Do Random "Shuffle"? From: "Dimitre Novatchev dnovatchev@xxxxxxxxx" <xsl-list-service@xxxxxxxxxxxxxxxxxxxxxx> Date: Sat, 13 Sep 2014 16:44:24 -0000 |
One will need just that from the provided full test: RandomizeList: <xsl:call-template name="randomizeList"> <xsl:with-param name="pList" select="/*/*"/> </xsl:call-template> On Sat, Sep 13, 2014 at 9:39 AM, Dimitre Novatchev <dnovatchev@xxxxxxxxx> wrote: > This can be done even with XSLT 1.0: > > http://fxsl.sourceforge.net/articles/Random/Casting%20the%20Dice%20with%20FXS L-htm.htm > > More specifically, use the FXSL 1 stylesheet module randomList.xsl > > Here is an existing test (demo): > > When this transformation (testRandomList.xsl): > > <xsl:stylesheet version="1.0" > xmlns:xsl="http://www.w3.org/1999/XSL/Transform" > xmlns:ext="http://exslt.org/common" > xmlns:f="http://fxsl.sf.net/" > xmlns:mySquare="f:mySquare" > xmlns:myDouble="f:myDouble" > exclude-result-prefixes="xsl f ext mySquare myDouble" > > > > <xsl:import href="randomList.xsl"/> > > <xsl:output omit-xml-declaration="yes" indent="yes"/> > <!-- This transformation must be applied to: > numList.xml > --> > > <mySquare:mySquare/> > <myDouble:myDouble/> > > <xsl:template match="/"> > > <xsl:variable name="vrtfRands"> > <xsl:call-template name="randomSequence"> > <xsl:with-param name="pLength" select="100"/> > </xsl:call-template> > </xsl:variable> > > Random Recursive Index (dScale (randomSequence 100)): > > <xsl:call-template name="_dScale"> > <xsl:with-param name="pRandSeq" > select="ext:node-set($vrtfRands)/*"/> > </xsl:call-template> > > Random Recursive Index 10: > > <xsl:variable name="vrtfRecIndex"> > <xsl:call-template name="_randomRecursiveIndex"> > <xsl:with-param name="pList" > select="/*/*"/> > </xsl:call-template> > </xsl:variable> > > <xsl:variable name="vRecIndex" > select="ext:node-set($vrtfRecIndex)/*"/> > > <xsl:for-each select="$vRecIndex"> > <xsl:copy-of select="."/>
 > </xsl:for-each> > > Randomized 10-elements list: > <xsl:call-template name="_permutationFromRecursiveIndex"> > <xsl:with-param name="pList" select="/*/*"/> > <xsl:with-param name="pRecIndex" select="$vRecIndex"/> > </xsl:call-template> > > RandomizeList: > <xsl:call-template name="randomizeList"> > <xsl:with-param name="pList" select="/*/*"/> > </xsl:call-template> > > <xsl:variable name="vFunSquare" > select="document('')/*/mySquare:*[1]"/> > > _mapFromRandIndex (^2) [1..10] seed: > <xsl:call-template name="_mapFromRandIndex"> > <xsl:with-param name="pFun" select="$vFunSquare"/> > <xsl:with-param name="pList" select="/*/*"/> > <xsl:with-param name="pRecIndex" select="$vRecIndex"/> > </xsl:call-template> > > <xsl:variable name="vFunDouble" > select="document('')/*/myDouble:*[1]"/> > > randomMap (*2) [1..10] seed: > <xsl:call-template name="randomMap"> > <xsl:with-param name="pFun" select="$vFunDouble"/> > <xsl:with-param name="pList" select="/*/*"/> > </xsl:call-template> > > randListIndex [1..10] seed: > <xsl:call-template name="randListIndex"> > <xsl:with-param name="pList" select="/*/*"/> > </xsl:call-template> > > </xsl:template> > > <xsl:template match="mySquare:*" mode="f:FXSL"> > <xsl:param name="arg1"/> > > <xsl:value-of select="$arg1 * $arg1"/> > </xsl:template> > <xsl:template match="myDouble:*" mode="f:FXSL"> > <xsl:param name="arg1"/> > > <xsl:value-of select="$arg1 + $arg1"/> > </xsl:template> > </xsl:stylesheet> > > is applied on this source XML document: > > <nums> > <num>01</num> > <num>02</num> > <num>03</num> > <num>04</num> > <num>05</num> > <num>06</num> > <num>07</num> > <num>08</num> > <num>09</num> > <num>10</num> > </nums> > > the result is: > > > > Random Recursive Index (dScale (randomSequence 100)): > > <el>27</el> > <el>90</el> > <el>14</el> > <el>78</el> > <el>65</el> > <el>13</el> > <el>27</el> > <el>85</el> > <el>75</el> > <el>33</el> > <el>31</el> > <el>26</el> > <el>9</el> > <el>40</el> > <el>31</el> > <el>80</el> > <el>19</el> > <el>44</el> > <el>52</el> > <el>7</el> > <el>8</el> > <el>73</el> > <el>55</el> > <el>16</el> > <el>68</el> > <el>20</el> > <el>29</el> > <el>4</el> > <el>3</el> > <el>30</el> > <el>51</el> > <el>41</el> > <el>14</el> > <el>32</el> > <el>66</el> > <el>4</el> > <el>19</el> > <el>51</el> > <el>48</el> > <el>59</el> > <el>30</el> > <el>1</el> > <el>49</el> > <el>57</el> > <el>14</el> > <el>53</el> > <el>13</el> > <el>10</el> > <el>10</el> > <el>38</el> > <el>13</el> > <el>37</el> > <el>13</el> > <el>36</el> > <el>22</el> > <el>7</el> > <el>28</el> > <el>25</el> > <el>28</el> > <el>7</el> > <el>29</el> > <el>3</el> > <el>34</el> > <el>28</el> > <el>7</el> > <el>13</el> > <el>14</el> > <el>5</el> > <el>32</el> > <el>25</el> > <el>25</el> > <el>24</el> > <el>8</el> > <el>26</el> > <el>23</el> > <el>14</el> > <el>11</el> > <el>18</el> > <el>15</el> > <el>6</el> > <el>5</el> > <el>6</el> > <el>9</el> > <el>4</el> > <el>8</el> > <el>14</el> > <el>12</el> > <el>12</el> > <el>5</el> > <el>2</el> > <el>5</el> > <el>1</el> > <el>4</el> > <el>1</el> > <el>4</el> > <el>4</el> > <el>1</el> > <el>2</el> > <el>1</el> > <el>1</el> > > Random Recursive Index 10: > > <el>3</el> > <el>9</el> > <el>2</el> > <el>6</el> > <el>5</el> > <el>1</el> > <el>2</el> > <el>3</el> > <el>2</el> > <el>1</el> > > Randomized 10-elements list: > <el>03</el> > <el>10</el> > <el>02</el> > <el>08</el> > <el>07</el> > <el>01</el> > <el>05</el> > <el>09</el> > <el>06</el> > <el>04</el> > > RandomizeList: > <el>03</el> > <el>10</el> > <el>02</el> > <el>08</el> > <el>07</el> > <el>01</el> > <el>05</el> > <el>09</el> > <el>06</el> > <el>04</el> > > _mapFromRandIndex (^2) [1..10] seed: > <el>9</el> > <el>100</el> > <el>4</el> > <el>64</el> > <el>49</el> > <el>1</el> > <el>25</el> > <el>81</el> > <el>36</el> > <el>16</el> > > randomMap (*2) [1..10] seed: > <el>6</el> > <el>20</el> > <el>4</el> > <el>16</el> > <el>14</el> > <el>2</el> > <el>10</el> > <el>18</el> > <el>12</el> > <el>8</el> > > randListIndex [1..10] seed: > <el>3</el> > <el>10</el> > <el>2</el> > <el>8</el> > <el>7</el> > <el>1</el> > <el>5</el> > <el>9</el> > <el>6</el> > <el>4</el> > > The last result gives us a random index of the integers in [1, 10] > > These indexes can be used to select in a random order 10 nodes. > > In XSLT 2 one can use the standard XPath function current-time() for > the creation of the seed: > http://www.w3.org/TR/xpath-functions/#func-current-time > > Cheers, > Dimitre > > > > On Sat, Sep 13, 2014 at 7:29 AM, Eliot Kimber ekimber@xxxxxxxxxxxx > <xsl-list-service@xxxxxxxxxxxxxxxxxxxxxx> wrote: >> Using XSLT 2 I need to implement rendering of "match table" questions >> where you have two sets of items, the match item and the thing it matches >> to. I want to present this as a literal table, where the first column is >> the match-from items in source order and the second column is the match-to >> items, in random order. >> >> I think this is best characterized as a "shuffle" problem, where you want >> to reorder a list randomly but all items in the list must be accounted >> for. >> >> I can think of a recursive algorithm: given a list, generate a random >> integer between 1 and the list length, select that item and add it to the >> result list, then call this function on the original list minus the node >> you just selected. >> >> Is there an easier or more efficient way to do it? >> >> Thanks, >> >> Eliot >> bbbbb >> Eliot Kimber, Owner >> Contrext, LLC >> http://contrext.com >> >> -- Cheers, Dimitre Novatchev --------------------------------------- Truly great madness cannot be achieved without significant intelligence. --------------------------------------- To invent, you need a good imagination and a pile of junk ------------------------------------- Never fight an inanimate object ------------------------------------- To avoid situations in which you might make mistakes may be the biggest mistake of all ------------------------------------ Quality means doing it right when no one is looking. ------------------------------------- You've achieved success in your field when you don't know whether what you're doing is work or play ------------------------------------- To achieve the impossible dream, try going to sleep. ------------------------------------- Facts do not cease to exist because they are ignored. ------------------------------------- Typing monkeys will write all Shakespeare's works in 200yrs.Will they write all patents, too? :) ------------------------------------- I finally figured out the only reason to be alive is to enjoy it.
Current Thread |
---|
|
<- Previous | Index | Next -> |
---|---|---|
Re: [xsl] How to Do Random "Shuffle, Dimitre Novatchev dn | Thread | Re: [xsl] How to Do Random "Shuffle, David Rudel fwqhgads |
Re: [xsl] How to Do Random "Shuffle, Dimitre Novatchev dn | Date | Re: [xsl] How to Do Random "Shuffle, Dimitre Novatchev dn |
Month |