如何使用XSL-FO格式化文本节点内的子节点?
问题分析与解决方案
核心问题
- 重复输出link内容:原
<text>模板中,<xsl:value-of select="."/>会提取该节点下所有文本内容(包括<link>里的文本),之后又调用<xsl:apply-templates select="link"/>再次处理link节点,导致link内容无格式显示一次,末尾又重复显示格式化后的版本。 - link模板取值错误:
<xsl:value-of select="whatever"/>是无效写法,应该用select="."来获取<link>节点自身的文本内容。 - 换行不生效:直接输出
在XSL-FO中可能无法被正确解析,需结合FO的布局元素实现换行。
修正后的XSL代码
<xsl:template match="text"> <fo:block> <xsl:apply-templates/> <xsl:text> </xsl:text> </fo:block> </xsl:template> <xsl:template match="link"> <fo:basic-link color="red" text-decoration="underline" external-destination="{@href}"> <xsl:value-of select="."/> </fo:basic-link> </xsl:template>
改动说明
<text>模板:移除<xsl:value-of select="."/>,改用<xsl:apply-templates/>,这样会按原文档顺序处理<text>下的所有子节点(普通文本和<link>);用<fo:block>包裹内容,确保FO能正确识别块级元素,同时添加 实现末尾换行。<link>模板:将<xsl:value-of select="whatever"/>改为<xsl:value-of select="."/>,正确获取link的文本内容;external-destination="{@href}"假设你的<link>节点有href属性存储链接地址,若实际属性名不同,替换为对应名称即可。
内容的提问来源于stack exchange,提问作者lagicarus
相关产品推荐
相关产品推荐

