在 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="
"/>
</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) 产生一个随机字符串序列并具有以下三个参数:
-
pRandomLength - 每个生成的随机字符串的所需长度
-
pNumResults - 想要生成的随机字符串数
-
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 并且您需要设置上面 <xsl:import> 声明的 href 属性,以指向文件系统的确切位置,导入的样式表文件所在的位置。