XSLT 2.0基于@level嵌套XML时出现重复内容问题求助
解决XSLT 2.0按@level属性嵌套时的重复内容问题
常见重复原因
- 未通过分组或递归逻辑限制节点处理范围,导致同一节点被多次匹配
- 未精准筛选当前节点的直接子层级节点(即
@level值比当前节点大1的节点) - 模板匹配规则过宽,未排除已被嵌套包裹的节点
通用解决方案示例
假设你的输入XML结构如下:
<root> <entry level="1">主条目1</entry> <entry level="2">子条目1-1</entry> <entry level="2">子条目1-2</entry> <entry level="1">主条目2</entry> <entry level="2">子条目2-1</entry> <entry level="3">子条目2-1-1</entry> </root>
可以采用递归分组+精准模板匹配的方式,确保每个节点仅被处理一次:
修正后的XSLT代码
<xsl:stylesheet version="2.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"> <xsl:output method="xml" indent="yes"/> <!-- 处理根节点,启动顶级节点分组 --> <xsl:template match="root"> <root> <xsl:for-each-group select="*" group-starting-with="*[@level = 1]"> <xsl:apply-templates select="current-grouping-key()"/> </xsl:for-each-group> </root> </xsl:template> <!-- 递归处理带level属性的节点,嵌套子层级 --> <xsl:template match="*[@level]"> <xsl:copy> <xsl:copy-of select="@*"/> <xsl:value-of select="text()"/> <!-- 筛选并处理当前节点的直接子层级节点 --> <xsl:for-each-group select="following-sibling::*[number(@level) = number(current()/@level) + 1]" group-ending-with="*[number(@level) <= number(current()/@level)]"> <xsl:apply-templates select="current-group()"/> </xsl:for-each-group> </xsl:copy> </xsl:template> </xsl:stylesheet>
核心修正要点
- 用
xsl:for-each-group的group-starting-with和group-ending-with精准划分节点组,避免重复选择 - 通过
number(@level)确保层级的数值比较准确,避免字符串比对的误差 - 递归时仅匹配当前节点的直接子层级节点,防止跨层级重复嵌套
如果你的实际输入XML、当前XSLT代码或期望输出与上述示例不同,可以提供具体片段,我再做针对性调整。
内容的提问来源于stack exchange,提问作者Rupesh_Kr
相关产品推荐
相关产品推荐

