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

XSLT 1.0分组问题:按数组内category code取值合并并引用外域ID

XSL基于CategoryCode分组实现方案

需求说明

  • 需基于输入中数组内部的category code取值I、F完成分组
  • 输出中的内部数组需要引用输入中位于数组外部的ID字段

输入文件内容

<?xml version="1.0" encoding="UTF-8"?>
<xsl:object xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:string name="Id">514355801</xsl:string>
<xsl:array name="Details">
<xsl:object>
<xsl:string name="CategoryCode">I</xsl:string>
<xsl:string name="CategoryDescription">INDIVIDUAL</xsl:string>
<xsl:string name="TypeCode">ABC</xsl:string>
<xsl:string name="TypeDescription">POCKET</xsl:string>
</xsl:object>
<xsl:object>
<xsl:string name="CategoryCode">I</xsl:string>
<xsl:string name="CategoryDescription">INDIVIDUAL</xsl:string>
<xsl:string name="TypeCode">DEF</xsl:string>
<xsl:string name="TypeDescription">BANK</xsl:string>
</xsl:object>
<xsl:object>
<xsl:string name="CategoryCode">F</xsl:string>
<xsl:string name="CategoryDescription">FAMILY</xsl:string>
<xsl:string name="TypeCode">ABC</xsl:string>
<xsl:string name="TypeDescription">POCKET</xsl:string>
</xsl:object>
<xsl:object>
<xsl:string name="CategoryCode">F</xsl:string>
<xsl:string name="CategoryDescription">FAMILY</xsl:string>
<xsl:string name="TypeCode">DEF</xsl:string>
<xsl:string name="TypeDescription">BANK</xsl:string>
</xsl:object>
</xsl:array>
</xsl:object>

预期输出内容

<?xml version="1.0" encoding="UTF-8"?>
<xsl:object xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:array name="OPDetails">
<xsl:object>
<xsl:string name="CategoryCode">I</xsl:string>
<xsl:array name="points">
<xsl:object>
<xsl:string name="Id">514355801</xsl:string>
<xsl:string name="TypeCode">ABC</xsl:string>
<xsl:string name="CategoryDescription">INDIVIDUAL</xsl:string>
<xsl:string name="TypeDescription">POCKET</xsl:string>
</xsl:object>
</xsl:array>
<xsl:array name="points">
<xsl:object>
<xsl:string name="Id">514355801</xsl:string>
<xsl:string name="TypeCode">DEF</xsl:string>
<xsl:string name="CategoryDescription">INDIVIDUAL</xsl:string>
<xsl:string name="TypeDescription">BANK</xsl:string>
</xsl:object>
</xsl:array>
</xsl:object>
<xsl:object>
<xsl:string name="CategoryCode">F</xsl:string>
<xsl:array name="points">
<xsl:object>
<xsl:string name="Id">514355801</xsl:string>
<xsl:string name="TypeCode">ABC</xsl:string>
<xsl:string name="CategoryDescription">FAMILY</xsl:string>
<xsl:string name="TypeDescription">POCKET</xsl:string>
</xsl:object>
</xsl:array>
<xsl:array name="points">
<xsl:object>
<xsl:string name="Id">514355801</xsl:string>
<xsl:string name="TypeCode">DEF</xsl:string>
<xsl:string name="CategoryDescription">FAMILY</xsl:string>
<xsl:string name="TypeDescription">BANK</xsl:string>
</xsl:object>
</xsl:array>
</xsl:object>
</xsl:array>
</xsl:object>

原有代码问题

之前编写的代码存在两个核心问题:

  1. 没有实现按CategoryCode分组逻辑,直接遍历所有Details下的对象,会为每个条目都生成独立的CategoryCode外层对象,和预期分组输出不符
  2. Id字段取值路径错误,Id存放在根节点下的xsl:object层级,不在当前循环的Details子对象内部,所以原代码无法正确取到Id值

可行实现代码

使用XSLT 1.0的Muenchian分组方法实现,代码如下:

<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="1.0">
<!-- 定义分组key,按CategoryCode的值分组 -->
<xsl:key name="categoryGroup" match="xsl:array[@name='Details']/xsl:object" use="xsl:string[@name='CategoryCode']"/>
<xsl:template match="/">
<!-- 提前把根节点的Id存为变量,方便后续引用 -->
<xsl:variable name="rootId" select="xsl:object/xsl:string[@name='Id']"/>
<xsl:object>
<xsl:array name="OPDetails">
<!-- 遍历唯一的CategoryCode分组 -->
<xsl:for-each select="xsl:object/xsl:array[@name='Details']/xsl:object[count(. | key('categoryGroup', xsl:string[@name='CategoryCode'])[1]) = 1]">
<xsl:object>
<xsl:string name="CategoryCode">
<xsl:value-of select="xsl:string[@name='CategoryCode']" />
</xsl:string>
<!-- 遍历当前分组下的所有条目,生成points数组 -->
<xsl:for-each select="key('categoryGroup', xsl:string[@name='CategoryCode'])">
<xsl:array name="points">
<xsl:object>
<xsl:string name="Id">
<xsl:value-of select="$rootId" />
</xsl:string>
<xsl:string name="TypeCode">
<xsl:value-of select="xsl:string[@name='TypeCode']" />
</xsl:string>
<xsl:string name="CategoryDescription">
<xsl:value-of select="xsl:string[@name='CategoryDescription']" />
</xsl:string>
<xsl:string name="TypeDescription">
<xsl:value-of select="xsl:string[@name='TypeDescription']" />
</xsl:string>
</xsl:object>
</xsl:array>
</xsl:for-each>
</xsl:object>
</xsl:for-each>
</xsl:array>
</xsl:object>
</xsl:template>
</xsl:stylesheet>

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.24 00:54:03