如何编写XSL解析XML内嵌锚点标签适配Apache FOP生成可点击PDF超链接
问题根因
xsl:value-of本身的设计就是仅提取目标节点的纯文本内容,会自动忽略所有子元素标签及其属性,所以你遇到的属性丢失现象是XSLT的标准行为,和Apache FOP无关。
解决方案(XSLT层面适配,无需修改XML源)
把原有直接取值的逻辑改为递归处理节点,匹配内嵌的<A>标签转换为XSL-FO标准超链接结构即可,以下是可直接复用的代码示例:
1. 替换原有SOLUTION取值逻辑
把原来的
<fo:block line-height="15pt" font-size="10pt" start-indent="2em" linefeed-treatment="preserve"> <xsl:value-of select="SOLUTION" /> </fo:block>
替换为
<fo:block line-height="15pt" font-size="10pt" start-indent="2em" linefeed-treatment="preserve"> <xsl:apply-templates select="SOLUTION/node()" /> </fo:block>
2. 新增A标签匹配模板
在XSLT的根节点下新增两个模板,分别处理超链接和普通文本:
<!-- 匹配XML中的A标签,转换为FO超链接 --> <xsl:template match="A"> <fo:basic-link external-destination="url({@HREF})" color="blue" text-decoration="underline"> <xsl:apply-templates select="node()" /> </fo:basic-link> </xsl:template> <!-- 默认文本节点处理,原样输出普通文本 --> <xsl:template match="text()"> <xsl:value-of select="." /> </xsl:template>
注意:
external-destination属性值需要用url()包裹是Apache FOP的规范要求,否则部分版本的FOP可能无法识别跳转地址。
扩展说明
如果后续XML中还出现其他内嵌HTML标签(比如<B>加粗、<I>斜体),只需要新增对应的匹配模板,转换为对应的FO标签(<fo:inline font-weight="bold">、<fo:inline font-style="italic">)即可适配,不需要修改XML预处理逻辑。
内容的提问来源于stack exchange,提问作者joeyofblades
相关产品推荐
相关产品推荐

