求助:如何通过XSLT按<Kod>节点分组转换XML
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
相关产品推荐
相关产品推荐

