This is the mail archive of the xsl-list@mulberrytech.com mailing list .


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]

Re: xsl:sort with a randomize ability ? or something



By virtue of the transform language's design goals, XSLT is not
something you are supposed to ask for different results from when the
same input is provided.  There are not supposed to be any side effects.
However, some of us use the language for some things I don't think the
XML gods ever thought the mind of man would conceive.  I had a similar
problem/concern in a return on investment information security model I
developed.  Eventually I found I did not need the solution but I think
that it should meet your needs.  (For my needs I used the xsl:number of
a tree element (at all levels) as an element [ index ] into a set of
numbers accessed via document() and saved in a global variable at the
beginning of each run.)

Solution 1: import a XML random number seed set file:

Take the general procedural language of your choice (if you use Perl you
can do an immediate execution from the command line) to generate an XML
text file of numbers.  There should be as many numbers in the file as
you could have questions (note: you might have a different number of
answer elements for each question and likely more than one).

Assume your generated file is roughly like the following:

<rns>
    <rn>22091</rn>
    <rn>221</rn>
    <rn>91</rn>
    <rn>7743</rn>
    <rn>878</rn>
</rns>

Use the document function to access the file in your XSLT and set a
global variable ($RNS) to the RNS data above.

Using the 'xsl:number' element to establish an index for each of your
question elements ($Index).

You then use the value of $RNS/rn[$Index] as the seed (call it $seed)
for a random number stream for the specific question you are
constructing.  If the number of answers for a particular question is
$NumAns, then use the first answer (from your input) as the (($seed  +
1) mod ($NumAns)) +1) answer output element.  Use the second input
answer as the (($seed  +  2) mod ($NumAns)) +1) answer output element.

Solution 2: pass a parameter from the command line or use a time based
function to provide an initial random number seed ($irns).  Get the seed
to be used for a particular question's answers by taking the question's
xsl:number element value times the initial random number seed (call the
new question seed $qs).  To retrieve the ith output answer (from among
the answer[1], answer[2],...answer[$NumAns] elements of the current
question) select='answer[ ((( $qs + $i ) mod $NumAns ) + 1)]'.

The second solution will work best if the IRNS is a prime number greater
than the number of questions and is changed each time you run the
question generation transform.

Either approach will choose different starting answers for each question
each time a different seed set or initial random number seed is
provided.

Hope this helps.

Frank


>> From: Robert Koberg
>>
>> Date: Fri, 10 Nov 2000 07:41:34 -0800
>>
>> I need to match a node set that would represent the answers to a mulitple
>> choice question.  It so happens that all of the answers are stored and given
>> to me with the correct answer always being first.
>>
>> Is there a way to randomize them so people don't start to see a pattern in
>> the test? :)
>>
--
Dr. Frank Mabry
Dept. of EE&CS
U.S. Military Academy
West Point, New York, 10996

Work Phone: 914-938-2960
work email: df6954@exmail.usma.edu
home email: fmabry@hvc.rr.com



 XSL-List info and archive:  http://www.mulberrytech.com/xsl/xsl-list

Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]