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

XSLT中切换xsl:use-attribute-sets属性集的最佳实现方法

XSLT动态切换属性集最简实现方案

你当前写法的冗余点是重复编写了完全一致的FO节点结构,仅属性集引用存在差异,不需要保留双分支重复结构,用XSLT原生能力即可实现零重复的属性集切换,全XSLT版本兼容:

核心实现逻辑

  • 仅做一次条件判断,将行、单元格需要引用的属性集名称存入变量,避免分支内重复写结构
  • 用<xsl:element>指令生成FO节点,该指令的use-attribute-sets属性原生支持属性值模板(AVT),可直接读取变量值绑定对应属性集
  • 重复的单元格节点可通过循环生成,进一步压缩冗余代码

优化后完整代码

<xsl:template name="myTemplate">
    <xsl:param name="number-of-parts" as="xs:integer"/>
    <!-- 单次判断匹配对应属性集 -->
    <xsl:variable name="rowAttrSet" select="if ($number-of-parts &lt;= 16) then '__toc__mini__table__row__empty' else '__toc__mini__table__row__empty__small'"/>
    <xsl:variable name="cellAttrSet" select="if ($number-of-parts &lt;= 16) then '__toc__mini__table__row__empty__cell' else '__toc__mini__table__row__empty__cell__small'"/>

    <!-- 生成带对应属性集的表格行 -->
    <xsl:element name="fo:table-row" use-attribute-sets="{$rowAttrSet}">
        <!-- 循环生成3个单元格,无需重复编码 -->
        <xsl:for-each select="1 to 3">
            <xsl:element name="fo:table-cell" use-attribute-sets="{$cellAttrSet}">
                <fo:block/>
            </xsl:element>
        </xsl:for-each>
    </xsl:element>
</xsl:template>

兼容说明

  • 如果使用XSLT 1.0环境,不支持1 to 3的序列循环语法,直接写3次单元格生成逻辑即可,核心的动态属性集绑定逻辑不受影响,依然比原双分支写法简洁60%以上
  • 该方案条件判断仅执行1次,运行性能高于原多分支重复结构,后续新增尺寸适配规则、调整单元格数量时,仅需修改变量判断逻辑或循环终值,维护成本极低

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.30 12:36:15