通用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>
方案说明
- 仅对
<Subject>节点添加特殊处理逻辑,其他节点完全沿用原有通用转换规则,不会影响依赖原有功能的接口。 - 当检测到当前节点是
<Subject>时,直接遍历父节点下的所有<Subject>节点,用数组语法包裹输出,无论数量多少都能生成正确的JSON数组格式。 - 数组项模板负责处理单个
<Subject>节点的内部转换,确保多节点时用逗号分隔,符合JSON语法规范。
内容的提问来源于stack exchange,提问作者CHANDRAJEET SINGH
相关产品推荐
相关产品推荐

