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

XSLT文件中@id参数不生效,如何在模板匹配规则中将@id设为参数

XSLT @id参数化匹配解决方案

前提说明

仅XSLT 2.0及以上版本支持在match属性中直接使用变量/参数,如果你使用XSLT 1.0,需要将匹配判断逻辑移入模板内部实现。

具体实现步骤

  1. 首先声明需要的参数,示例中将tref节点的匹配属性、Object节点的对比字段分别设置为可配置参数:
<!-- tref节点需要匹配的属性名,默认值为id -->
<xsl:param name="trefMatchAttr" select="'id'" />
<!-- Object节点用于对比的子节点名,默认值为ID -->
<xsl:param name="objectCompareField" select="'ID'" />
  1. 修改原有模板匹配规则,用动态属性/节点引用替代硬编码的固定名称:
    XSLT中不能直接用@$参数名的方式引用动态属性,需要通过@*[local-name() = $参数名]的语法获取指定名称的属性值,动态子节点取值同理使用*[local-name() = $参数名]。
    修改后的模板代码如下:
<xsl:template match="tref[@*[local-name() = $trefMatchAttr] = ($exsampleXml//Topic/Object[IncludeInWeb = 'false' and @*[local-name() = $trefMatchAttr] = ./*[local-name() = $objectCompareField]]/*[local-name() = $objectCompareField])][1]" />

XSLT 1.0兼容方案

如果使用XSLT 1.0,不支持在match属性中使用参数,改用模板内部判断的方式实现:

<xsl:param name="trefMatchAttr" select="'id'" />
<xsl:param name="objectCompareField" select="'ID'" />

<xsl:template match="tref[1]">
  <xsl:variable name="currentAttrVal" select="@*[local-name() = $trefMatchAttr]" />
  <xsl:variable name="excludeIdList" select="$exsampleXml//Topic/Object[IncludeInWeb = 'false' and @*[local-name() = $trefMatchAttr] = ./*[local-name() = $objectCompareField]]/*[local-name() = $objectCompareField]" />
  <xsl:if test="not($currentAttrVal = $excludeIdList)">
    <!-- 原有tref节点的处理逻辑写在此处 -->
  </xsl:if>
</xsl:template>

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.05 07:54:02