如何用XSLT生成含大小写字母和数字的32位随机字符串?
解决XSLT生成32位混合字符随机字符串的问题
你当前用generate-id()拼接的方式存在两个核心问题:
- 同一节点多次调用
generate-id()返回的结果完全一致,拼接后字符串重复度极高 generate-id()的输出通常仅包含小写字母和数字,无法生成大写字母
下面针对XSLT 1.0(你当前使用的版本)提供可行的实现方案:
实现思路
- 定义包含大写字母、小写字母、数字的完整字符池
- 利用系统时间戳(
system-property('xsl:timestamp'))作为随机种子,结合模运算从字符池中随机选取字符 - 通过递归模板循环生成32个随机字符,最终拼接成目标字符串
完整代码示例
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform" exclude-result-prefixes="xsl"> <xsl:output method="xml" version="1.0" encoding="UTF-8" indent="yes"/> <!-- 定义包含大写、小写、数字的字符池 --> <xsl:variable name="char-pool" select="'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789'"/> <!-- 字符池长度 --> <xsl:variable name="pool-length" select="string-length($char-pool)"/> <!-- 递归生成随机字符的模板 --> <xsl:template name="generate-random-string"> <xsl:param name="length" select="32"/> <xsl:param name="current-string" select="''"/> <xsl:if test="$length > 0"> <!-- 用时间戳+当前递归次数生成随机种子,避免重复 --> <xsl:variable name="seed" select="number(concat(substring-before(system-property('xsl:timestamp'), '.'), $length))"/> <!-- 计算随机位置(1-based) --> <xsl:variable name="random-pos" select="1 + ($seed mod $pool-length)"/> <!-- 选取对应字符 --> <xsl:variable name="random-char" select="substring($char-pool, $random-pos, 1)"/> <!-- 递归调用,长度减1,拼接新字符 --> <xsl:call-template name="generate-random-string"> <xsl:with-param name="length" select="$length - 1"/> <xsl:with-param name="current-string" select="concat($current-string, $random-char)"/> </xsl:call-template> </xsl:if> <!-- 递归结束时输出最终字符串 --> <xsl:if test="$length = 0"> <xsl:value-of select="$current-string"/> </xsl:if> </xsl:template> <xsl:template match="node()"> <xsl:apply-templates/> </xsl:template> <xsl:template match="/"> <ABC> <xsl:for-each select="ABC/ABC"> <DEF> <externalCode> <!-- 调用随机字符串生成模板 --> <xsl:call-template name="generate-random-string"/> </externalCode> <userId><xsl:value-of select="userId"/></userId> </DEF> </xsl:for-each> </ABC> </xsl:template> </xsl:stylesheet>
代码说明
char-pool变量包含了所有需要的字符类型,你可以根据需求调整字符顺序或增减字符- 随机种子结合了时间戳和递归剩余长度,避免循环生成时出现重复字符串
- 递归模板每次生成一个随机字符,直到凑够32位长度
如果你的环境支持XSLT 2.0及以上版本,还可以用更简洁的方式:利用random-number-generator()函数直接生成随机索引,代码会更简洁,但上述XSLT 1.0的方案兼容性更强,适配大多数旧版处理器。
内容的提问来源于stack exchange,提问作者megrao1811
相关产品推荐
相关产品推荐

