XSLT文件中@id参数不生效,如何在模板匹配规则中将@id设为参数
XSLT @id参数化匹配解决方案
前提说明
仅XSLT 2.0及以上版本支持在match属性中直接使用变量/参数,如果你使用XSLT 1.0,需要将匹配判断逻辑移入模板内部实现。
具体实现步骤
- 首先声明需要的参数,示例中将tref节点的匹配属性、Object节点的对比字段分别设置为可配置参数:
<!-- tref节点需要匹配的属性名,默认值为id --> <xsl:param name="trefMatchAttr" select="'id'" /> <!-- Object节点用于对比的子节点名,默认值为ID --> <xsl:param name="objectCompareField" select="'ID'" />
- 修改原有模板匹配规则,用动态属性/节点引用替代硬编码的固定名称:
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
相关产品推荐
相关产品推荐

