如何将XML中的图片数据插入XSL模板?(Apache-FOP转PDF场景)
Apache FOP中XML内嵌Base64图片的XSL处理方案
一、替换模板中的type和data值
你的XML里的图片数据是内嵌的Base64格式,要把type和data节点值插入到XSL模板的src属性中,最直接的方式是使用XSLT属性值模板(Attribute Value Templates),用大括号{}包裹XPath表达式,即可自动替换为对应节点的文本内容。
修改后的XSL模板片段:
<fo:external-graphic content-height="60pt" height="auto" width="auto" src="url(data:{type};base64,{data})"/>
注:这段代码的前提是当前XSL模板的上下文节点是
<image>节点(比如模板匹配规则为match="image")。如果上下文不是<image>,需要调整XPath,例如用{./image/type}和{./image/data}指定准确节点位置。
二、更优的图片插入方案
1. 优先使用外部图片文件
如果图片体积较大,内嵌Base64会大幅增加XML文件大小,同时提升FOP的内存占用和处理时间。更优的做法是:
- 将图片保存为独立文件(如
image.png) - 在XML中存储图片的文件路径:
<image> <path>./images/image.png</path> </image> - XSL模板中直接引用路径:
<fo:external-graphic content-height="60pt" height="auto" width="auto" src="url({path})"/>
这种方式处理效率更高,也更便于图片的管理和复用。
2. 内嵌Base64的替代写法
如果必须内嵌图片,除了属性值模板,也可以用xsl:attribute手动构建src属性,效果完全一致:
<fo:external-graphic content-height="60pt" height="auto" width="auto"> <xsl:attribute name="src"> <xsl:text>url(data:</xsl:text> <xsl:value-of select="type"/> <xsl:text>;base64,</xsl:text> <xsl:value-of select="data"/> <xsl:text>)</xsl:text> </xsl:attribute> </fo:external-graphic>
注意:确保XML中的Base64数据没有多余的换行或空格,否则Apache FOP可能无法正确解析图片。
内容的提问来源于stack exchange,提问作者maybesomename
相关产品推荐
相关产品推荐

