使用XSLT提取HTML高度属性并实现通用模板改造
通用化XSLT行模板解决方案
没问题,这就帮你把模板改得通用起来,用变量替代固定的高度值117,让它能处理所有Row_XXX格式的table~
核心思路
- 从table的
class属性中自动提取高度数值(比如从Row_117里拿到117) - 把所有硬编码的
117替换为动态变量 - 让模板匹配所有以
Row_开头的table,不用再为每个高度写单独模板
修改后的完整代码
<!-- 通用化行模板,适配任意Row_XXX格式的class --> <xsl:template name="Row_Template" match="xhtml:table[starts-with(@class, 'Row_')]"> <!-- 从class属性提取高度数值:Row_XXX → XXX --> <xsl:variable name="rowHeight" select="substring(@class, 5)"/> <table width="600" height="{$rowHeight}" border="0" cellpadding="0" cellspacing="0" align="center" class="deviceWidth"> <tr> <td> <xsl:text disable-output-escaping="yes"> <![CDATA[ <!--[if gte mso 9]> <table width="600" height="]]> </xsl:text> <!-- 把高度变量插入MSO条件注释 --> <xsl:value-of select="$rowHeight"/> <xsl:text disable-output-escaping="yes"> <![CDATA[" align="center"> <tr> <td width="300"> <![endif]--> ]]> </xsl:text> <xsl:apply-templates select="./*"/> </td> </tr> </table> </xsl:template>
关键细节说明
- 匹配规则优化:用
starts-with(@class, 'Row_')替代固定的Row_117,这样所有Row_100、Row_150这类table都会被这个模板处理 - 动态高度提取:
substring(@class, 5)从Row_XXX里截取高度值("Row_"是4个字符,从第5位开始就是数字部分) - MSO注释处理:因为CDATA块里不能直接用变量,所以把注释拆成三段:先输出CDATA前缀,再插入变量值,最后输出CDATA后缀,确保Outlook的条件注释能正确拿到高度值
可选:手动传参调用模板
如果需要手动调用模板而不是靠自动匹配,可以给模板加参数,这样更灵活:
<xsl:template name="Row_Template"> <!-- 定义必填的高度参数 --> <xsl:param name="rowHeight" required="yes"/> <table width="600" height="{$rowHeight}" border="0" cellpadding="0" cellspacing="0" align="center" class="deviceWidth"> <tr> <td> <xsl:text disable-output-escaping="yes"> <![CDATA[ <!--[if gte mso 9]> <table width="600" height="]]> </xsl:text> <xsl:value-of select="$rowHeight"/> <xsl:text disable-output-escaping="yes"> <![CDATA[" align="center"> <tr> <td width="300"> <![endif]--> ]]> </xsl:text> <xsl:apply-templates select="./*"/> </td> </tr> </table> </xsl:template> <!-- 调用示例 --> <xsl:call-template name="Row_Template"> <xsl:with-param name="rowHeight" select="117"/> </xsl:call-template>
内容的提问来源于stack exchange,提问作者Sarah
相关产品推荐
相关产品推荐

