如何使用XSLT为TEI诗歌文档内不同元素设置差异化样式
XSLT分色渲染TEI手写诗歌标注的实现方案
核心问题根源
现有代码无法区分嵌套元素样式的本质原因:l元素模板中使用xsl:value-of select="."直接输出节点合并后的纯文本,该写法会跳过所有内部子元素的模板匹配流程,所有嵌套内容都会被作为无差别的纯字符串渲染,无法应用独立分色规则。
分步修正实现
1. 调整诗句(l)元素的渲染逻辑
替换原有l模板的核心内容,不再直接输出全节点文本,改为通过 xsl:apply-templates 递归匹配内部所有子节点,让嵌套元素可以被各自的样式规则接管:
<xsl:template match="l" priority="0"> <span style="color: black;"> <xsl:apply-templates/> </span> <br/> </xsl:template>
原有匹配lg元素的模板不需要改动,可继续使用。
2. 为嵌套标注元素配置独立样式
按照TEI文献学的通用显示习惯,为三类常见嵌套标注编写独立匹配模板,设置对应颜色和样式:
- 缩写
abbr:使用深蓝色突出标注,和正文形成视觉区分
<xsl:template match="abbr"> <span style="color: #1a5fb4;"> <xsl:apply-templates/> </span> </xsl:template>
- 删除内容
del:使用浅灰色加删除线的样式,匹配手写删除痕迹的视觉认知
<xsl:template match="del"> <span style="color: #888888; text-decoration: line-through;"> <xsl:apply-templates/> </span> </xsl:template>
- 增补内容
add:使用橄榄绿色标注,区分手写补写内容和原文文字
<xsl:template match="add"> <span style="color: #2d882d;"> <xsl:apply-templates/> </span> </xsl:template>
效果说明
小提示:XSLT内置的默认模板规则会自动将所有未被其他模板匹配的文本节点原样输出,不需要额外编写文本节点的匹配逻辑,不会出现正文文字丢失的问题。
调整完成后可实现的效果:
- 所有
lg元素内的l诗句依然按规则单独成行,默认正文文字为黑色 - 当诗句内部存在嵌套标注时,会自动递归匹配对应样式;哪怕标注元素内部还有多层嵌套(比如
add里嵌套abbr),也会正确应用最内层的样式规则,不会出现样式断层 - 后续如果需要新增其他标注元素的显示规则,只需要参照上述结构新增对应模板即可,不需要修改
l元素的核心渲染逻辑
内容的提问来源于stack exchange,提问作者mindolianum
相关产品推荐
相关产品推荐

