You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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转换,逻辑清晰且高效。

  1. 编写如下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>
  1. 在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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.12 02:35:05