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

通用XSLT实现XML转JSON时单节点转数组的适配问题

解决XSLT转换XML到JSON时单节点强制转为数组的问题

问题背景

使用通用XSLT代码将XML转换为JSON时,存在以下问题:当<Subject>节点为单个时,输出的是普通JSON对象;只有当<Subject>是多个节点时,才会输出JSON数组。现需在不破坏原有多接口依赖功能的前提下,实现单<Subject>节点强制转为JSON数组。

输出对比

当前输出(单节点时)

{
  "Root": {
    "Subject": {
      "Name": "Math"
    }
  }
}

期望输出(单节点时)

{
  "Root": {
    "Subject": [
      {
        "Name": "Math"
      }
    ]
  }
}

XML示例

单节点XML

<Root>
  <Subject>
    <Name>Math</Name>
  </Subject>
</Root>

多节点XML

<Root>
  <Subject>
    <Name>Math</Name>
  </Subject>
  <Subject>
    <Name>English</Name>
  </Subject>
</Root>

XSLT解决方案

核心思路是对<Subject>节点单独做逻辑判断:无论节点数量是1个还是多个,都强制输出为JSON数组;其他节点保持原有通用转换逻辑,确保不影响依赖原有功能的接口。

以下是修改后的关键XSLT代码:

<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
  <xsl:output method="text" encoding="UTF-8"/>
  
  <!-- 通用节点处理模板 -->
  <xsl:template match="*">
    <xsl:variable name="nodeName" select="local-name()"/>
    <xsl:if test="not(position()=1)">,</xsl:if>
    "<xsl:value-of select="$nodeName"/>":<xsl:choose>
      <!-- 针对Subject节点强制转为数组 -->
      <xsl:when test="$nodeName='Subject'">
        <xsl:text>[</xsl:text>
        <xsl:apply-templates select="../Subject" mode="array-item"/>
        <xsl:text>]</xsl:text>
      </xsl:when>
      <!-- 其他节点保留原有转换逻辑 -->
      <xsl:otherwise>
        <xsl:if test="count(child::*) > 0">{<xsl:apply-templates/>}</xsl:if>
        <xsl:if test="count(child::*) = 0">"<xsl:value-of select="."/>"</xsl:if>
      </xsl:otherwise>
    </xsl:choose>
  </xsl:template>
  
  <!-- Subject节点的数组项处理模板 -->
  <xsl:template match="Subject" mode="array-item">
    <xsl:if test="not(position()=1)">,</xsl:if>
    {<xsl:apply-templates select="*"/>}
  </xsl:template>
  
  <!-- 根节点初始化 -->
  <xsl:template match="/">
    {<xsl:apply-templates/>}
  </xsl:template>
</xsl:stylesheet>

方案说明

  1. 仅对<Subject>节点添加特殊处理逻辑,其他节点完全沿用原有通用转换规则,不会影响依赖原有功能的接口。
  2. 当检测到当前节点是<Subject>时,直接遍历父节点下的所有<Subject>节点,用数组语法包裹输出,无论数量多少都能生成正确的JSON数组格式。
  3. 数组项模板负责处理单个<Subject>节点的内部转换,确保多节点时用逗号分隔,符合JSON语法规范。

内容的提问来源于stack exchange,提问作者CHANDRAJEET SINGH

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.15 18:07:15