TIBCO BW 5.14中按SCHEDULEDAY分组生成动态键JSON的问题
在TIBCO BW 5.14中按日期分组XML记录并生成指定格式JSON的实现方法
需求说明
现有如下XML格式的多条Record数据:
<Record> <TESTID>1</TESTID> <SCHEDULEDAY>2023-08-22</SCHEDULEDAY> <CUSTID>5</CUSTID> <MOBILENUMBER>222222222</MOBILENUMBER> <RADIONUM>12345</RADIONUM> </Record> <Record> <TESTID>2</TESTID> <SCHEDULEDAY>2023-08-22</SCHEDULEDAY> <CUSTID>5</CUSTID> <MOBILENUMBER>222222222</MOBILENUMBER> <RADIONUM>12345</RADIONUM> </Record> <Record> <TESTID>3</TESTID> <SCHEDULEDAY>2023-08-26</SCHEDULEDAY> <CUSTID>6</CUSTID> <MOBILENUMBER>222222222</MOBILENUMBER> <RADIONUM>12345</RADIONUM> </Record>
需要提取SCHEDULEDAY字段值作为JSON的动态元素标签,将同日期的记录合并到对应键的数组中,生成如下格式的JSON:
{ "finalData": { "2023-08-22": [ { "TESTID": 1, "CUSTID": 5, "Mobile": 222222222, "radioNum": 12345 }, { "TESTID": 2, "CUSTID": 5, "Mobile": 222222222, "radioNum": 12345 } ], "2023-08-26": [ { "TESTID": 3, "CUSTID": 6, "Mobile": 222222222, "radioNum": 12345 } ] } }
实现方法
方法一:使用XSLT Transform活动(推荐)
TIBCO BW 5.14支持XSLT 2.0,可通过XSLT直接完成分组和JSON转换,逻辑清晰且高效。
- 编写如下XSLT转换代码:
<xsl:stylesheet version="2.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"> <xsl:output method="json" encoding="UTF-8" indent="yes"/> <xsl:template match="/"> <xsl:text>{ "finalData": {</xsl:text> <!-- 按SCHEDULEDAY分组所有Record节点 --> <xsl:for-each-group select="Record" group-by="SCHEDULEDAY"> <!-- 输出日期作为JSON键 --> <xsl:text>"</xsl:text> <xsl:value-of select="current-grouping-key()"/> <xsl:text>": [</xsl:text> <!-- 遍历当前分组内的记录,转换为JSON对象 --> <xsl:for-each select="current-group()"> <xsl:text>{</xsl:text> <xsl:text>"TESTID": </xsl:text><xsl:value-of select="TESTID"/>, <xsl:text>"CUSTID": </xsl:text><xsl:value-of select="CUSTID"/>, <xsl:text>"Mobile": </xsl:text><xsl:value-of select="MOBILENUMBER"/>, <xsl:text>"radioNum": </xsl:text><xsl:value-of select="RADIONUM"/> <xsl:text>}</xsl:text> <!-- 处理数组元素间的逗号,最后一个元素不加 --> <xsl:if test="position() != last()">,</xsl:if> </xsl:for-each> <xsl:text>]</xsl:text> <!-- 处理日期键间的逗号,最后一个键不加 --> <xsl:if test="position() != last()">,</xsl:if> </xsl:for-each-group> <xsl:text>} }</xsl:text> </xsl:template> </xsl:stylesheet>
- 在BW流程中配置:
- 拖拽XSLT Transform活动到流程画布。
- 将输入的XML Record集合连接到活动的输入端口。
- 在活动配置界面,选择"Inline XSLT",将上述代码粘贴进去;也可将代码保存为
.xsl文件后选择"File"引用。 - 运行流程,即可得到目标格式的JSON输出。
方法二:使用Group By + JSON Construct活动
若偏好使用BW原生组件,可通过以下步骤实现:
- 分组处理:拖拽Group By活动,配置分组键为
SCHEDULEDAY,将输入的XML记录按日期分组,得到以日期为键的分组集合。 - 构造JSON:拖拽JSON Construct活动,构建
finalData根节点:- 遍历每个分组,将分组的日期值设为动态键(通过表达式
$group-key获取)。 - 对每个分组内的记录,映射字段:
TESTID对应原节点的TESTID,CUSTID对应原节点的CUSTID,Mobile对应原节点的MOBILENUMBER,radioNum对应原节点的RADIONUM,并将这些对象组成数组作为动态键的值。
- 遍历每个分组,将分组的日期值设为动态键(通过表达式
内容的提问来源于stack exchange,提问作者abhishek karan
相关产品推荐
相关产品推荐

