Subject: Re: [xsl] Re: question on random numbers for browser XSLT From: Dimitre Novatchev <dnovatchev@xxxxxxxxx> Date: Fri, 24 Jul 2009 16:51:33 -0700 |
Or, for XSLT 1.0 one could write the following (knowing that the values contain only uppercase latin characters or digits): <xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns:testmap="testmap" exclude-result-prefixes="xsl testmap" > <xsl:import href="str-dvc-map.xsl"/> <!-- to be applied on any xml source --> <testmap:testmap/> <xsl:output method="text"/> <xsl:variable name="vChars" select= "'0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ'" /> <xsl:template match="/"> <xsl:variable name="vTestMap" select="document('')/*/testmap:*[1]"/> <xsl:variable name="vNumericVal"> <xsl:call-template name="str-map"> <xsl:with-param name="pFun" select="$vTestMap"/> <xsl:with-param name="pStr" select="'IDACQ0LB'"/> </xsl:call-template> </xsl:variable> <xsl:value-of select="$vNumericVal mod 65536"/> </xsl:template> <xsl:template name="double" match="testmap:*"> <xsl:param name="arg1"/> <xsl:value-of select="string-length(substring-before($vChars,$arg1))"/> </xsl:template> </xsl:stylesheet> -- 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 ------------------------------------- You've achieved success in your field when you don't know whether what you're doing is work or play On Fri, Jul 24, 2009 at 4:06 PM, Dimitre Novatchev<dnovatchev@xxxxxxxxx> wrote: > Hermann, > >> Now these values look different for different browsers, and need to >> "somehow" >> be converted to a seed value for FXSLs random generator. >> >> Ideas? > > > You could try something simple as the following: > > B sum(string-to-codepoints($pId)) B mod B 65536 > > > and see that the results' variety is satisfactory. > > -- > 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 > ------------------------------------- > You've achieved success in your field when you don't know whether what > you're doing is work or play > > > > > On Fri, Jul 24, 2009 at 3:28 PM, Hermann > Stamm-Wilbrandt<STAMMW@xxxxxxxxxx> wrote: >> Dimitre, >> >>> > If you have decided to go with a service providing random numbers then >>> > xslt-ish way (set based) to do it would be a service receiving a number >> and >>> > returning an xml with a specified number of random numbers. >>> > >>> >>> Using a service to provide a random sequence is much more unreliable >>> and inefficient than just doing this in pure XSLT, as this has been >>> done by FXSL for many years: >>> >>> >> http://fxsl.sourceforge.net/articles/Random/Casting%20the%20Dice%20with%20FXS L-htm.htm >> >> first of all, FXSL is a cool library and the documentation at the link is >> informative. >> >> I tried fxsl-1.2 and installed these necessary files on my webserver: >> curry.xsl B iter.xsl B map.xsl B random.xsl B test-random.xsl >> >> First I realized that it did work on FF3 and not on FF2 (because of the >> missing >> support of exslt:node-set there). Then I tried it on IE6 and it did not >> work first. >> After applying below patch it worked under IE6, too. >> You may try it out here: >> http://www.stamm-wilbrandt.de/en/xsl-list/random/fxsl-1.2/test-random.xml >> >> The output is the same as generated by eg. "xsltproc test-random.xsl >> some.xml", but >> it is ALWAYS THE SAME output (try it repeatedly). >> >> I knew of the different techniques in generating pseudo random numbers but >> what >> is really needed is to be able to provide a changing seed (eg. initialize >> with >> the number of seconds since 1/1/1970, time(NULL) in C). >> >> Then I remembered the generate-id use of Scott, and after reading Michaels >> last >> post the following fragment seems to be an always changing value: >> http://www.stamm-wilbrandt.de/en/xsl-list/random/scott.xml >> >> B B B B <xsl:variable name="seed"><a/></xsl:variable> >> B B B B <xsl:value-of select="generate-id(exsl:node-set($seed))" /> >> >> Now these values look different for different browsers, and need to >> "somehow" >> be converted to a seed value for FXSLs random generator. >> >> Ideas? >> >> >> ============================================================================= >> from "http://dpcarlisle.blogspot.com/2007/05/exslt-node-set-function.html" >> $ diff random.xsl.orig random.xsl >> 20c20,21 >> < B exclude-result-prefixes="xsl ext randScale myRandNext >> mySingleRandDistFun x" >> --- >>> B xmlns:msxsl="urn:schemas-microsoft-com:xslt" >>> B exclude-result-prefixes="xsl ext msxsl randScale myRandNext >> mySingleRandDistFun x". >> 30a32,36 >>> B <msxsl:script language="JScript" implements-prefix="ext"> >>> B B this['node-set'] = B function (x) { >>> B B B return x; >>> B B } >>> B </msxsl:script> >> $ >> >> >> >> Mit besten GrC<Cen / Best wishes, >> >> Hermann Stamm-Wilbrandt >> Developer, XML Compiler >> WebSphere DataPower SOA Appliances >> ---------------------------------------------------------------------- >> IBM Deutschland Research & Development GmbH >> Vorsitzender des Aufsichtsrats: Martin Jetter >> GeschC$ftsfC<hrung: Erich Baier >> Sitz der Gesellschaft: BC6blingen >> Registergericht: Amtsgericht Stuttgart, HRB 243294 >> >> >> >> B B B B B B Dimitre Novatchev >> B B B B B B <dnovatchev@gmail >> B B B B B B .com> B B B B B B B B B B B B B B B B B B B B B B B B B B B To >> B B B B B B B B B B B B B B B B B B B xsl-list@xxxxxxxxxxxxxxxxxxxxxx >> B B B B B B 07/24/2009 11:00 B B B B B B B B B B B B B B B B B B B B B cc >> B B B B B B PM >> B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B Subject >> B B B B B B B B B B B B B B B B B B B Re: [xsl] Re: question on random >> B B B B B B Please respond to B B B B numbers for browser XSLT >> B B B B B B xsl-list@xxxxxxxx >> B B B B B B B lberrytech.com >> >> >> >> >> >> >> >> >>> If you have decided to go with a service providing random numbers then >>> xslt-ish way (set based) to do it would be a service receiving a number >> and >>> returning an xml with a specified number of random numbers. >>> >> >> Using a service to provide a random sequence is much more unreliable >> and inefficient than just doing this in pure XSLT, as this has been >> done by FXSL for many years: >> >> >> http://fxsl.sourceforge.net/articles/Random/Casting%20the%20Dice%20with%20FXS L-htm.htm >> >> >> >> -- >> 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 >> ------------------------------------- >> You've achieved success in your field when you don't know whether what >> you're doing is work or play >> >> >> >> On Fri, Jul 24, 2009 at 1:48 PM, Vladimir >> Nesterovsky<vladimir@xxxxxxxxxxxxxxxxxxxx> wrote: >>> If you have decided to go with a service providing random numbers then >>> xslt-ish way (set based) to do it would be a service receiving a number >> and >>> returning an xml with a specified number of random numbers. >>> -- >>> Vladimir Nesterovsky >>> http://www.nesterovsky-bros.com/ >>> >>> >>>> To Ben: >>>> The cache-append idea was my first thought, but I couldn't think of a >>> >>> good >>>> >>>> way to pull together how to have each request be unique. It's possible >>>> using node-set(), though: >>>> ... >>>> ... >>>> B B <xsl:choose> >>>> B B B <xsl:when test="function-available('exsl:node-set')"> >>>> B B B B <xsl:value-of select="document(concat('/cgi-bin/rand.pl?', >>> >>> $scale, >>>> >>>> '&x=', generate-id(exsl:node-set($seed))))" /> >>>> B B B </xsl:when> >>>> B B B <xsl:when test="function-available('msxsl:node-set')"> >>>> B B B B <xsl:value-of select="document(concat('/cgi-bin/rand.pl?', >>> >>> $scale, >>>> >>>> '&x=', generate-id(msxsl:node-set($seed))))" /> >>>> B B B </xsl:when> >>>> ... >>> >>> I tried your solution and after replacing '&x=' with '+' it directly >>> worked on my local web server! >>> (I did not know that generate-id works in a browser) >>> >>> But as already posted it did not work after installed on my real >> webserver >>> because that does not have enough power to handle the six document opens. >>> >>> Btw, I really like the solution of David Carlisle to provide >> exslt:node-set >>> for IE browsers (and not having to deal with exslt/msxml): >>> http://dpcarlisle.blogspot.com/2007/05/exslt-node-set-function.html >> >> > > > > -- > 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 > ------------------------------------- > You've achieved success in your field when you don't know whether what > you're doing is work or play
Current Thread |
---|
|
<- Previous | Index | Next -> |
---|---|---|
Re: [xsl] Re: question on random nu, Dimitre Novatchev | Thread | Re: [xsl] Re: question on random nu, Hermann Stamm-Wilbra |
Re: [xsl] Re: question on random nu, Dimitre Novatchev | Date | Re: [xsl] Re: question on random nu, Hermann Stamm-Wilbra |
Month |