XSLT循环中Plan B表头重复输出问题的修正需求
解决XSLT 2.0分组时表头重复输出问题
问题说明
需要将XML中的<Detail>节点按<Plan>值分为两组:Plan A(Plan=N)和Plan B(Plan=Y),每组仅在首行显示对应表头,但原有<xsl:for-each>循环逻辑导致Plan B表头重复输出。
解决方案
使用XSLT 2.0的<xsl:for-each-group>分组功能,直接按<Plan>值分组,每个分组仅输出一次表头,再遍历组内节点输出数据。
输入XML示例
<Root> <Detail> <Plan>N</Plan> <Data>Data A1</Data> </Detail> <Detail> <Plan>N</Plan> <Data>Data A2</Data> </Detail> <Detail> <Plan>Y</Plan> <Data>Data B1</Data> </Detail> <Detail> <Plan>Y</Plan> <Data>Data B2</Data> </Detail> </Root>
修正后的XSLT代码
<?xml version="1.0" encoding="UTF-8"?> <xsl:stylesheet version="2.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"> <xsl:output method="text" encoding="UTF-8"/> <xsl:template match="/Root"> <!-- 按Plan字段值分组 --> <xsl:for-each-group select="Detail" group-by="Plan"> <!-- 输出当前分组对应的表头 --> <xsl:choose> <xsl:when test="current-grouping-key()='N'"> <xsl:text>=== Plan A 表头 === </xsl:text> </xsl:when> <xsl:when test="current-grouping-key()='Y'"> <xsl:text>=== Plan B 表头 === </xsl:text> </xsl:when> </xsl:choose> <!-- 遍历当前分组内的所有Detail节点 --> <xsl:for-each select="current-group()"> <xsl:value-of select="Data"/> <xsl:text> </xsl:text> </xsl:for-each> <!-- 组间添加空行分隔(可选) --> <xsl:text> </xsl:text> </xsl:for-each-group> </xsl:template> </xsl:stylesheet>
期望输出
=== Plan A 表头 === Data A1 Data A2 === Plan B 表头 === Data B1 Data B2
方案说明
<xsl:for-each-group>会将所有<Detail>节点按Plan值聚合为独立分组,每个分组仅执行一次表头输出逻辑,彻底避免重复。current-grouping-key()用于获取当前分组的Plan值,以此判断输出哪个表头。current-group()返回当前分组内的所有<Detail>节点,遍历即可输出组内数据。
内容的提问来源于stack exchange,提问作者User501
相关产品推荐
相关产品推荐

