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 <= 16) then '__toc__mini__table__row__empty' else '__toc__mini__table__row__empty__small'"/> <xsl:variable name="cellAttrSet" select="if ($number-of-parts <= 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
相关产品推荐
相关产品推荐

