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

求助:如何通过XSLT按<Kod>节点分组转换XML

XSLT按分组修正方案

核心思路

用XSLT分组机制实现:每个仅输出一次,将同组内的转换为节点下的子节点。根据XSLT版本不同,提供两种可行方案。

示例输入XML

假设你的源XML结构如下:

<Root>
  <Item>
    <Kod>001</Kod>
    <Mnozstvi>10</Mnozstvi>
  </Item>
  <Item>
    <Kod>001</Kod>
    <Mnozstvi>20</Mnozstvi>
  </Item>
  <Item>
    <Kod>002</Kod>
    <Mnozstvi>15</Mnozstvi>
  </Item>
</Root>

XSLT 1.0版本(Muenchian分组)

适配多数旧版处理器,通过键值匹配实现分组:

<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
  <xsl:output method="xml" indent="yes"/>

  <!-- 定义分组键:以<Kod>的值为分组依据 -->
  <xsl:key name="kod-group" match="Item" use="Kod"/>

  <xsl:template match="/Root">
    <Stavy>
      <!-- 仅处理每个分组的第一个节点,避免重复输出<Kod> -->
      <xsl:for-each select="Item[generate-id() = generate-id(key('kod-group', Kod)[1])]">
        <Stav>
          <Kod><xsl:value-of select="Kod"/></Kod>
          <!-- 遍历当前分组内的所有<Mnozstvi>节点 -->
          <xsl:for-each select="key('kod-group', Kod)">
            <Mnozstvi><xsl:value-of select="Mnozstvi"/></Mnozstvi>
          </xsl:for-each>
        </Stav>
      </xsl:for-each>
    </Stavy>
  </xsl:template>
</xsl:stylesheet>

XSLT 2.0+版本(简化写法)

若处理器支持XSLT 2.0及以上,使用原生分组语法更简洁:

<xsl:stylesheet version="2.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
  <xsl:output method="xml" indent="yes"/>

  <xsl:template match="/Root">
    <Stavy>
      <!-- 按<Kod>的值直接分组 -->
      <xsl:for-each-group select="Item" group-by="Kod">
        <Stav>
          <Kod><xsl:value-of select="current-grouping-key()"/></Kod>
          <!-- 遍历当前组内的所有<Mnozstvi>节点 -->
          <xsl:for-each select="current-group()">
            <Mnozstvi><xsl:value-of select="Mnozstvi"/></Mnozstvi>
          </xsl:for-each>
        </Stav>
      </xsl:for-each-group>
    </Stavy>
  </xsl:template>
</xsl:stylesheet>

预期输出

<Stavy>
  <Stav>
    <Kod>001</Kod>
    <Mnozstvi>10</Mnozstvi>
    <Mnozstvi>20</Mnozstvi>
  </Stav>
  <Stav>
    <Kod>002</Kod>
    <Mnozstvi>15</Mnozstvi>
  </Stav>
</Stavy>

关键说明

  • Muenchian分组通过xsl:key和generate-id()判断节点是否为分组首节点,从根源避免重复输出。
  • XSLT 2.0+的xsl:for-each-group语法更直观,current-grouping-key()直接获取分组键值,current-group()调用组内全部节点。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.02 06:20:27