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

XSLT模板问题:仅添加最后一个缺失标签,求排查原因

问题原因分析

这个问题我之前也碰到过,核心是XSLT的模板匹配规则在起作用!

你的两个模板都是针对<jsonObject>节点的,而输入的<jsonObject>同时满足not(aaa)和not(bbb)这两个条件。在XSLT的规则里:如果多个模板的匹配模式都能命中同一个节点,且它们的优先级完全相同(这里两个模板的优先级一致),处理器会自动选择最后定义的那个模板执行。所以第一个模板直接被忽略,只有第二个模板生效,自然就只添加了<bbb>标签。

解决方案

方案一:合并模板(最简洁)

把两个判断逻辑合并到同一个模板中,用<xsl:if>分别检查每个元素是否缺失,按需添加:

<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
  <!-- 处理需要添加缺失元素的jsonObject -->
  <xsl:template match="jsonObject[not(aaa) or not(bbb)]">
    <xsl:copy>
      <!-- 复制所有属性 -->
      <xsl:apply-templates select="@*"/>
      <!-- 缺失aaa则添加 -->
      <xsl:if test="not(aaa)">
        <aaa>test</aaa>
      </xsl:if>
      <!-- 缺失bbb则添加 -->
      <xsl:if test="not(bbb)">
        <bbb>test2</bbb>
      </xsl:if>
      <!-- 复制原有的子节点 -->
      <xsl:apply-templates select="node()"/>
    </xsl:copy>
  </xsl:template>

  <!-- 身份模板:复制所有其他节点和属性,保证原结构不变 -->
  <xsl:template match="@*|node()">
    <xsl:copy>
      <xsl:apply-templates select="@*|node()"/>
    </xsl:copy>
  </xsl:template>
</xsl:stylesheet>

方案二:模式(mode)扩展(更灵活)

如果以后需要添加更多缺失元素,推荐用模式分步骤处理,避免模板冲突:

<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
  <!-- 身份模板:负责复制所有节点和属性,是XSLT处理默认结构的基础 -->
  <xsl:template match="@*|node()">
    <xsl:copy>
      <xsl:apply-templates select="@*"/>
      <!-- 触发插入缺失元素的逻辑 -->
      <xsl:apply-templates select="." mode="insert-missing"/>
      <xsl:apply-templates select="node()"/>
    </xsl:copy>
  </xsl:template>

  <!-- 插入缺失的aaa -->
  <xsl:template match="jsonObject[not(aaa)]" mode="insert-missing">
    <aaa>test</aaa>
  </xsl:template>

  <!-- 插入缺失的bbb -->
  <xsl:template match="jsonObject[not(bbb)]" mode="insert-missing">
    <bbb>test2</bbb>
  </xsl:template>

  <!-- 空模板:当jsonObject已经有所有需要的元素时,什么都不做 -->
  <xsl:template match="jsonObject" mode="insert-missing"/>
</xsl:stylesheet>

这个方案的优势是扩展成本低——以后要加新元素(比如<ccc>),只需要新增一个对应的mode="insert-missing"模板即可,无需修改主逻辑。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.12 04:39:35