【问题标题】:Creating Random string containing over 25 characters of numbers and letters (upper and lower case)创建包含超过 25 个数字和字母字符(大写和小写)的随机字符串
【发布时间】:2022-06-17 22:18:24
【问题描述】:

如何使用 XSLT 创建一个长度超过 25 个字符的由数字和字母组成的随机字符串?

示例:Khb34KXQ23ib34KDNBBE342nQE

我的 XSLT 是这样的:

<xsl:function name="kh:shortRandom">
        <xsl:sequence select="generate-id()"/>
    </xsl:function>
    
  
   <xsl:template match="/">
        <test>
            <randomId><xsl:value-of select="concat(kh:shortRandom(), kh:shortRandom(), kh:shortRandom(), kh:shortRandom())"/></randomId>
        </test>
    </xsl:template>

但答案总是一样的..(e1d1).. 因为我调用了该函数四次.. 答案也是四次。 (e1d1e1d1e1d1e1d1)

我希望每次都有不同的角色。有点像密码生成器,但只有字母和数字。

Tnx :)

【问题讨论】:

  • 我为你找到了this thread。希望对您有所帮助。
  • select="generate-id()" 每次都提供相同的字符。我希望每次都有不同的性格。类似于密码生成器,但只有数字和字母。
  • XSLT 1.0 到 2.0 中没有可用的随机函数。您使用的是哪种 XSLT 处理器?
  • @Mozamel ,当使用 XSLT 2.0 甚至 1.0 时,可以在 FXSL 的帮助下轻松创建想要的功能,如我的回答所示。更多信息请见:fxsl.sourceforge.net/articles/Random/…

标签: xslt-1.0 xslt-2.0


【解决方案1】:

在 XSLT 3.0 (XPath 3.1) 中可以使用 random-number-generator() 函数。

对于 XSLT 2.0,我建议使用 FXSL 的随机数函数 - 例如:"Casting the Dice with FXSL: Random Number Generation Functions in XSLT"

使用这个,这里是想要的随机字符串生成函数的实现:

<xsl:stylesheet version="2.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
 xmlns:xs="http://www.w3.org/2001/XMLSchema" xmlns:my="my">
 <xsl:import href="C:/CVS-DDN/fxsl-xslt2/f/random.xsl"/>
 <xsl:output method="text"/>
 
 <xsl:variable name="vSeed" select=
   "xs:integer(seconds-from-time(current-time()))
   * xs:integer(minutes-from-time(current-time()))
   * xs:integer(hours-from-time(current-time()))"/>

  <xsl:template match="/">
     <xsl:value-of select="my:randomStrings(25, 10, $vSeed)" separator="&#xA;"/>
  </xsl:template>

  <xsl:function name="my:randomStrings">
    <xsl:param name="pRandomLength" as="xs:integer"/>
    <xsl:param name="pNumResults" as="xs:integer" />
    <xsl:param name="pSeed" as="xs:integer"/>
    
    <xsl:variable name="vAlphaNum" select="'abcdefghijklmnopqrstuvwxyz0123456789'"/>

    <xsl:variable name="vNums">
       <xsl:call-template name="randomSequence">
          <xsl:with-param name="pSeed" select="$pSeed"/>
          <xsl:with-param name="pStart" select="1"/>
          <xsl:with-param name="pEnd" select="36"/>
          <xsl:with-param name="pLength" select="$pRandomLength*$pNumResults"/>
       </xsl:call-template>
    </xsl:variable>
    
    <xsl:sequence select=
     "for $vK in 1 to $pNumResults
        return
          string-join(for $i in
                            $vNums/*[position() gt ($vK -1)*$pRandomLength 
                                   and position() le $vK*$pRandomLength]
                                         /xs:integer(.)
                        return substring($vAlphaNum, $i, 1),
                      '')
          "/>
  </xsl:function>
 </xsl:stylesheet>

上面实现的函数my:randomStrings(pRandomLength, pNumResults, pSeed) 产生一个随机字符串序列并具有以下三个参数:

  1. pRandomLength - 每个生成的随机字符串的所需长度
  2. pNumResults - 想要生成的随机字符串数
  3. pSeed - 随机生成器的种子。使用不同的种子调用函数会产生不同的结果。

上面的代码调用该函数生成10个随机字符串,每个长度为25。种子是从当前时间计算的,因此每次执行转换的结果都会不同。

这是一个结果:

azdkex5yi5rm3suewa7bxazpc
qi2qsg7qvl7en4cx2c5s9vfrp
l8t0lv659uba500t6e7fea518
7bt80g6bpjtjltna7ru6e3t15
t90s62fvnex5yqcq2osv97n5z
hibzw8g95wv15x2s2wv8cobem
dqiubm165tp1pci34hparuqs7
5d0chkl85liaowx3v88isk4oo
6iw5iktzaqa7jnf4g9lakqdhk
insg7iggsc22fqd1jkhbrxo53

还有一个:

bstudsgn85xq7dncy9fubu8we
g9hkl0qf493u0x7xmaz0hunqd
9lyclhrp19iz33v0hdmt7txoh
b45t1t1xfves5fjn3syzilhjq
p5bh89iojemh7adb41suew20d
goznie54278vfb4968zx3n9o8
lmouaz8j7i033mtjx1t6ymbjn
jxgqajz7g9db0g6j4o8l6ukgw
2ge6nhv69emcqanc6f63yeoro
yws75ttmbnsbyxvwwch86wbe2

注意

如上所述,您需要有 downloaded the FXSL library 并且您需要设置上面 &lt;xsl:import&gt; 声明的 href 属性,以指向文件系统的确切位置,导入的样式表文件所在的位置。

【讨论】:

    【解决方案2】:
    const characters = 'abcdefghijklmnopqrstuvwxyz0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ';
    const charactersLength = characters.length;
    
    const generate25letterrandomstring = () => {
        let randomString = '';
        for (let i = 0; i < 25; i++) {
            randomString += characters.charAt(Math.floor(Math.random() * charactersLength));
        }
        console.log(randomString);
        return randomString;
    }
    
    generate25letterrandomstring()
    

    【讨论】:

    • Tanx.. 但这不是我想要的。我希望每次都有不同的角色。
    • 该问题被标记为xslt-1.0xslt-2.0。你的答案是什么语言?
    • 我已将this thread 链接到您上面。有帮助吗?
    猜你喜欢
    • 1970-01-01
    • 2012-02-06
    • 1970-01-01
    • 1970-01-01
    • 2020-01-04
    • 2016-01-23
    • 2017-03-13
    • 1970-01-01
    相关资源
    最近更新 更多