fo:external-模板文件中带参数的图形

fo:external-graphic with parameter in template file

我正在尝试一些直截了当的事情,我会说不太复杂。但我不知道该怎么做:我想在 XSL-FO 文档中包含图像。

详细:

我有两个文件,一个包含我的文本的逻辑内容,另一个逻辑上包含格式说明。我正在使用 Apache 应用程序 fop 将其编译成 PDF:

fop -q -xml contents.xml -xsl formatting.xsl -pdf output.pdf

这适用于纯文本。文件 contents.xml 包含如下内容:

<part>
  Lorem ipsum bla
</part>

文件 formatting.xsl 包含如下内容:

<xsl:stylesheet ...>
  <xsl:template match="part">
    <fo:block ...>
      <xsl:apply-templates/>
    </fo:block>
  </xsl:template>
</xsl:stylesheet>

现在我想添加一些图像。因为会有很多图像都采用类似的格式,所以我想在 contents.xml 中为每个图像做一个简单的抽象,将参数传递给模板。例如。 <img path="path/to/my/image.png"/> 可以,但 <img>path/to/my/image.png</img> 甚至 <img><path value="path/to/my/image.png"/></img> 也可以。

formatting.xsl中的模板应理解并使用传递的参数并将其放入<fo:external-graphic src="[parameter-value]"\>

此外,我需要能够提供几种格式文件中的一种,以实现相同内容但格式不同的不同 PDF(例如,相同内容的平装版、精装版和手稿版) .

但是我到现在为止所有的尝试都失败了。我唯一设法做到的是没有传递参数的解决方案,因此图像的路径然后被硬编码在格式文件中。

我用 <xsl:call-template><xsl:with-param><xsl:attribute name="src"> 等尝试了很多变体,但到目前为止没有任何效果。 fop 抱怨使用错误或结果未在 PDF 中显示图像。

我觉得这一定是很多人都想做的非常简单和典型的事情,但我仍然没有找到任何实现类似我的案例的例子。

任何人都可以给我一个如何做到这一点的例子吗?

编辑:

我在 contents.xml 中最喜欢的用法是 <img path="img/001_title.png"/>,但在 formatting.xsl 中我不知道如何制定我的模板来完成这项工作。没有参数 path 我可以使用这个:

<xsl:template match="img">
  <fo:block>
    <fo:external-graphic src="img/001_title.png"/>
  </fo:block>
</xsl:template>

但是正如我已经写过的那样,这会硬编码路径并且不能重复使用以插入具有另一条路径的另一张图片。

我也尝试过,例如这在 formatting.xsl:

<xsl:template match="img">
  <xsl:param name="path"/>
  <fo:block>
    <fo:external-graphic src="$path"/>
  </fo:block>
</xsl:template>

但是然后在 contents.xml 传递 我应该使用的参数值

<xsl:call-template name="img">
  <xsl:with-param name="path" select="img/001_title.png"/>
</xsl:call-template>

这让我从 fop 那里得到了一个错误,指出 xsl 东西在我使用它的 contents.xml 的地方是非法的。

此外,如上所述,模板中参数的 use 可能不是预期的那样,因为我认为这需要使用 <xsl:value-of select="$path"/> 或类似的,但如果应该在属性的双引号内使用该值,我不知道该怎么做。

为此,似乎语法

<fo:external-graphic>
  <xsl:attribute name="src">
    <xsl:value-of select="$path"/>
  </xsl:attribute>
</fo:external-graphic>

应该会被使用。但我也无法使用它,因为我也不清楚如何从 contents.xml 文件中 使用 它。

你的 content.xml 会不会包含以下内容:

<contents>
<part>
  Lorem ipsum bla
</part>
<img path="img/001_title.png"/>
<part>
  Lorem ipsum bla
</part>
<img path="img/002_title.png"/>
</contents>

然后在您的 XSL 中使用:

<xsl:template match="img">
<fo:external-graphic>
  <xsl:attribute name="src">
    <xsl:value-of select="@path"/>
  </xsl:attribute>
</fo:external-graphic>
</xsl:template>

您的 XML 可以包含带有路径的图像,它们可以指向任何地方,当 XSL 遇到一个路径时,它会将其输出到 XSL FO 中。该模板直接从 XML.

中的 img 标签使用 @path 属性

那么任何类型的路径都可以:

<img path="relative/to/something.png"/>
<img path="http://mywebsite.com/logo.png"/>
<img path="http://mywebsite.com/mycode.php?getimage='123242'"/>