You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何编写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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.30 07:45:03