XSLT 1.0分组重排XML节点 解决XML转JSON同类型节点丢失问题
XSLT 1.0 交错节点重排方案
你所用的xml-to-json转换逻辑默认对连续同名节点做数组合并,交错排列的同名节点会被判定为重复键,最终仅保留最后一个值。提前将同类型节点聚合排列即可解决该问题,无需修改原有JSON转换脚本,可直接使用下述XSLT 1.0脚本做前置结构转换:
<?xml version="1.0" encoding="UTF-8"?> <xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns:ns="http://www.w3.org/furniture"> <!-- 身份模板:全量复制原XML的节点、属性、文本、命名空间,保留原始结构 --> <xsl:template match="@*|node()"> <xsl:copy> <xsl:apply-templates select="@*|node()"/> </xsl:copy> </xsl:template> <!-- 自定义DivideDetails节点的子节点输出顺序 --> <xsl:template match="ns:DivideDetails"> <xsl:copy> <!-- 保留节点自身属性 --> <xsl:apply-templates select="@*"/> <!-- 按原顺序输出所有ParentRecord节点 --> <xsl:apply-templates select="ns:ParentRecord"/> <!-- 按原顺序输出所有ChildRecord节点 --> <xsl:apply-templates select="ns:ChildRecord"/> <!-- 若存在其他类型节点,默认追加在两类记录之后,可按需调整顺序 --> <xsl:apply-templates select="*[not(self::ns:ParentRecord or self::ns:ChildRecord)]"/> </xsl:copy> </xsl:template> </xsl:stylesheet>
实现说明
- 脚本基于XSLT 1.0标准编写,兼容所有支持XSLT 1.0的解析器,无需依赖更高版本特性
- 两类节点内部严格保留原始出现顺序,不会打乱ParentRecord和ChildRecord的先后对应关系
- 输出结构完全匹配验证过的可正常转JSON的聚合格式,根节点属性、命名空间、子字段内容均无修改,直接接入原有JSON转换流程即可得到完整结果
- 若后续DivideDetails下新增其他节点类型,脚本会自动保留,不会出现内容遗漏;如需调整节点排序优先级,直接调整对应
xsl:apply-templates标签的先后顺序即可
内容的提问来源于stack exchange,提问作者btt3165
相关产品推荐
相关产品推荐

