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

XSLT身份模板如何应用#all模式并排除指定mode,减少重复修改?

解决方案:排除特定模式的身份模板

当然有完美的方案解决这个痛点!不用每次新增模式都手动修改身份模板,我们可以通过两种方式实现「应用所有模式但排除指定模式」的需求,分情况来看:

方法一:XSLT 2.0+ 优雅实现(推荐)

从XSLT 2.0开始,模式属性支持#all except (模式列表)的语法,直接帮你排除不需要的模式,代码非常简洁:

<xsl:template match="node()|@*" mode="#all except (mode5, mode6)" priority="-1">
  <xsl:copy>
    <xsl:apply-templates select="node()|@*" mode="#current"/>
  </xsl:copy>
</xsl:template>

这个写法的逻辑很直观:#all代表所有模式,except (mode5, mode6)把这两个模式从范围中剔除。以后新增任何模式(只要不是mode5/mode6),都会自动被这个身份模板处理,完全不用手动更新模板,从根源避免了后续开发的冲突。

方法二:兼容XSLT 1.0的降级方案

如果你的运行环境还在使用XSLT 1.0(不支持except语法),可以用「优先级覆盖」的思路解决:保留原有的#all身份模板,然后为mode5和mode6单独编写更高优先级的模板,让它们跳过身份转换逻辑:

<!-- 原身份模板:匹配所有模式,优先级设为-1(最低) -->
<xsl:template match="node()|@*" mode="#all" priority="-1">
  <xsl:copy>
    <xsl:apply-templates select="node()|@*" mode="#current"/>
  </xsl:copy>
</xsl:template>

<!-- 为需要排除的模式编写高优先级模板,这里示例是不执行复制操作 -->
<xsl:template match="node()|@*" mode="mode5 mode6" priority="0">
  <!-- 如果你需要mode5/6仅处理子节点而不复制当前节点,就保留这行;
       如果完全不需要处理,直接留空即可 -->
  <xsl:apply-templates select="node()|@*" mode="#current"/>
</xsl:template>

因为优先级0比-1高,当处理mode5或mode6时,处理器会优先匹配后面的模板,跳过身份模板的复制逻辑。新增模式时同样不需要修改这些代码,非常省心。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.27 06:49:51