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

XSL如何在正确位置输出嵌套文本元素

问题根因分析

你当前遇到的重复输出问题,核心是rec递归模板存在两处逻辑错误:

  • 错误调用xsl:value-of select="current()":该语句会提取当前节点下所有后代文本节点的拼接内容,后续递归处理子节点时,子节点的文本会被再次输出,最终导致内容重复
  • 节点遍历范围遗漏文本节点:$parents/*仅选择了元素类型的子节点,漏掉了直接的文本节点,导致嵌套结构的文本顺序和结构匹配异常

修复后的rec模板代码
<xsl:template name="rec">
<xsl:param name="parents"></xsl:param>
  <!-- 遍历所有子节点,包含文本节点、元素节点 -->
  <xsl:for-each select="$parents/node()">
    <!-- 处理文本节点:直接输出内容 -->
    <xsl:if test="self::text()">
      <xsl:value-of select="."/>
    </xsl:if>
    <!-- 保留原有img元素特殊处理逻辑 -->
    <xsl:if test="self::img">
      <img class="{@class}" src="{@src}" style="max-width:100%;"/>
    </xsl:if>
    <!-- 处理除img外的其他元素节点 -->
    <xsl:if test="self::* and not(self::img)">
      <xsl:element name="{local-name()}">
        <!-- 可选:保留元素原有属性,不需要可删除该行 -->
        <xsl:copy-of select="@*"/>
        <!-- 递归处理当前元素的子节点,无需提前输出文本 -->
        <xsl:call-template name="rec">
          <xsl:with-param name="parents" select="."/>
        </xsl:call-template>
      </xsl:element>
    </xsl:if>
  </xsl:for-each>
</xsl:template>

修复说明
  • 去掉了原逻辑中多余的xsl:value-of select="current()"语句,改为仅在匹配到纯文本节点时输出内容,从根源避免内容重复
  • 将节点遍历范围从$parents/*(仅元素节点)改为$parents/node()(包含文本、元素等所有子节点),保证输出的嵌套标签、文本顺序完全匹配原XML结构
  • 完全保留原有图片处理逻辑,不会影响图片的正常显示
  • 新增的属性复制逻辑可以保留原元素的class、style等自定义属性,适配不同文档的样式需求

内容的提问来源于stack exchange,提问作者Bastian Schuetz

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.08 05:30:00