如何使用XSLT 3.0实现数据随机排序而非按输入顺序输出?
XSLT 3.0实现JSON数组随机排序方案
针对你需要将同empid下、类别为Peer/Stakeholder或Direct Report且questionno=1的response随机排序后生成DRPSQ1字段JSON数组的需求,可通过以下方式修改XSLT代码:
关键实现逻辑
利用XSLT 3.0内置的random-number-generator()生成不重复的随机序列,以此为依据对目标节点集进行排序,再转换为JSON数组。
修改后的代码示例
假设你原有处理逻辑大致如下:
<xsl:template match="your-target-node"> <DRPSQ1> <xsl:value-of select="json-to-xml(array { ../*[empid = current()/empid and (category='Peer/Stakeholder' or category='Direct Report') and questionno=1]/response })" method="text"/> </DRPSQ1> </xsl:template>
替换为带随机排序的版本:
<xsl:template match="your-target-node"> <DRPSQ1> <!-- 筛选符合条件的response节点 --> <xsl:variable name="valid-responses" select="../*[empid = current()/empid and (category='Peer/Stakeholder' or category='Direct Report') and questionno=1]/response"/> <!-- 生成随机排序后的节点集 --> <xsl:variable name="randomized-set" select=" $valid-responses!map { 'response': ., 'sort-key': random-number-generator()?permute(1 to count($valid-responses))[position()] }!sort(., function($a, $b) { $a?sort-key lt $b?sort-key })?response "/> <!-- 转换为JSON数组输出 --> <xsl:value-of select="json-to-xml(array { $randomized-set })" method="text"/> </DRPSQ1> </xsl:template>
代码解释
- 筛选节点:
$valid-responses先定位所有符合条件的response元素 - 绑定随机排序键:通过
random-number-generator()?permute()生成与节点数量匹配的不重复随机整数序列,每个response对应一个唯一的排序键 - 随机排序:使用
sort()方法根据排序键对节点重新排列,提取排序后的response值 - 生成JSON数组:将排序后的节点集转为JSON数组格式输出
每次运行代码时,DRPSQ1字段的数组元素都会呈现随机排列,不再遵循原XML中的输入顺序。
内容的提问来源于stack exchange,提问作者Buddi
相关产品推荐
相关产品推荐

