XSLT 2.0使用group-adjacent按属性分组空属性节点失效问题求解
问题分析
你原有实现的核心问题在于逻辑不匹配需求:
- 你对所有Position属性值执行相邻分组,且将所有分组内多节点产生的默认空格统一替换为
-,这会误处理非A属性的连续节点 - 你没有针对性判断:仅当相邻分组是
Position="A"且组内节点数≥2时,才需要在组内节点之间插入连字符
正确实现代码
使用XSLT 2.0及以上版本的实现如下:
<xsl:variable name="columnId"> <xsl:for-each-group select="CabinLayout/Columns" group-adjacent="string(@Position)"> <xsl:choose> <!-- 仅当分组的Position属性为A且组内至少2个节点时,用-连接组内文本 --> <xsl:when test="current-grouping-key() = 'A' and count(current-group()) ge 2"> <xsl:value-of select="current-group()" separator="-"/> </xsl:when> <!-- 其他场景直接拼接组内所有文本 --> <xsl:otherwise> <xsl:value-of select="current-group()" separator=""/> </xsl:otherwise> </xsl:choose> </xsl:for-each-group> </xsl:variable> <ColumnID><xsl:value-of select="$columnId"/></ColumnID>
逻辑验证
该实现完全匹配你的三个测试样例:
- 样例1中连续
Position="A"的C、D节点被分到同一组,组内用-连接得到C-D,其余分组直接拼接,最终输出ABC-DEF - 样例2中
Position="A"的分组仅1个D节点,不需要加连字符,最终输出ABCDEFGHJK - 样例3中有两组连续
Position="A"的节点,分别拼接为C-D和G-H,最终输出ABC-DEFG-HJK
内容的提问来源于stack exchange,提问作者Umaimath Thonikkadavan
相关产品推荐
相关产品推荐

