Re: [xsl] Re: question on random numbers for browser XSLT

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,
>>>>
>>>> '&amp;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,
>>>>
>>>> '&amp;x=', generate-id(msxsl:node-set($seed))))" />
>>>> B  B  B </xsl:when>
>>>> ...
>>>
>>> I tried your solution and after replacing '&amp;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