fo:在模板文件中加入参数的外部图形。

问题描述 投票:1回答:1

我在尝试一些简单明了的东西,我想说不太复杂。 但是我不知道怎么做。 我想在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中显示图像。

我有一种感觉,这一定是非常简单和典型的东西,很多人都想做,但我仍然没有找到任何例子来实现像我这样的情况。

有谁能给我一个如何做到这一点的例子吗?

EDIT:

我最喜欢的用法是 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 在我使用的地方。

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

对于这个问题,似乎语法

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

是应该使用的。 但我也不能用这个,因为,我又不清楚怎么用 使用 归根结底 contents.xml 文件。

xml image xslt xsl-fo apache-fop
1个回答
1
投票

是不是像你的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'"/>
© www.soinside.com 2019 - 2024. All rights reserved.