fo:external-graphic 模板文件中带有参数

Posted

技术标签:

【中文标题】fo:external-graphic 模板文件中带有参数【英文标题】:fo:external-graphic with parameter in template file 【发布时间】:2020-08-26 12:05:48 【问题描述】:

我正在尝试一些直截了当的东西,我想说不要太复杂。但我不知道该怎么做:我想在 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 中的每个图像提供一个简单的抽象事物,将参数传递给模板。例如。 &lt;img path="path/to/my/image.png"/&gt; 可以,但&lt;img&gt;path/to/my/image.png&lt;/img&gt; 甚至&lt;img&gt;&lt;path value="path/to/my/image.png"/&gt;&lt;/img&gt; 之类的也可以。

formatting.xsl中的模板应理解并使用传入的参数,并将其放在&lt;fo:external-graphic src="[parameter-value]"\&gt;中。

另外,我需要能够提供几种格式文件之一,以便为相同内容但具有不同格式的不同 PDF(例如,平装本、精装本和相同内容的手稿版本)。

但是到目前为止我所有的试验都失败了。我唯一能做到的就是没有传递参数的解决方案,因此图像的路径被硬编码在格式化文件中。

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

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

谁能给我一个例子来说明如何做到这一点?

编辑:

我在contents.xml 中最喜欢的用法是&lt;img path="img/001_title.png"/&gt;,但在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 可能不是应有的那样,因为我认为这需要像 using &lt;xsl:value-of select="$path"/&gt; 或类似的东西,但我没有'如果该值应该在属性的双引号内使用,则不知道该怎么做。

为此,似乎语法

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

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

【问题讨论】:

你没有明确解释它是如何失败的,这听起来像是一个路径问题。 什么意思——路径问题?我的图像的路径?正如我写的那样,我尝试了很多组合,但都没有奏效,经常带有暗示我做错了的消息,所以我认为这些消息不会帮助任何知道如何立即做到这一点的人。如果有帮助,我可以创建错误消息的集合。但我认为任何了解我的愿望并知道如何实现的人都能够告诉我如何去做。我主要是缺少有关如何执行此操作的入门教程,我并没有真正遇到奇怪的问题。 您能否添加一个您最想使用的contents.xml 格式的示例以及您当前处理它的模板,以便我们看看是否可以改进它?还请说明该模板当前是如何出错的。 嗨@TonyGraham,我在我的问题中添加了一部分,更详细地解释了我想要什么,我试图实现什么以及这有什么明显的问题。如果您认为返回的具体错误消息 fop 会对您有所帮助,我可以提供(从另一台计算机,即稍后)。 您使用 XSLT 处理器生成 XSL-FO 文件的命令行是什么? 【参考方案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'"/>

【讨论】:

啊,是的,我就是这么想的。我只是不知道这个@ 语法来访问属性:-) 非常感谢,这按预期解决了我的问题! (而且:这不是每个 XSL-FO 教程都会涵盖的典型示例,这仍然很奇怪。)

以上是关于fo:external-graphic 模板文件中带有参数的主要内容,如果未能解决你的问题,请参考以下文章

template模板使用方法

多个项目中的多文件项模板

django-模板文件继承

根据模板客户端有条件地在模板中排除 CSS 资源文件

如何在 Jinja2 模板中获取当前模板的文件名?

Django框架—— 模板层:模板导入模板继承静态文件