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

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) &lt;= 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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.13 04:37:11