XSL FO将动态值从HTML传递到XSLT变量

时间:2019-05-19 08:34:47

标签: xslt pdf-generation xsl-fo apache-fop

我试图使用FOP从html文件创建pdf。 我的要求是,我想在运行时传递变量值。 如何在运行时传递变量值?

2 个答案:

答案 0 :(得分:1)

目前尚不清楚您可以在什么时候注入“变量”,也不清楚您打算如何做。这是一个示例,可能会提供一些启发。它仅使用简单的身份转换,并省去了所有FO内容,以简化操作。

一般原则-放在隐藏的div中,其中包含一些变量代码。例如,为了简单起见,您的输入HTML现在具有以下内容:

<html>
    <div class="variables" style="display:none">
        <div class="var_1" data-value="variable 1 value"/>
        <div class="var_2" data-value="variable 2 value"/>
        <div class="var_3" data-value="variable 3 value"/>
    </div>
    <div>
        <div>Var 1 Value: <span class="variable" data-ref="var_1"/></div>
        <div>Var 2 Value: <span class="variable" data-ref="var_2"/></div>
        <div>Var 3 Value: <span class="variable" data-ref="var_3"/></div>
    </div>
</html>

然后您为要插入变量的span上匹配的模板修改XSL:

<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="1.0">
    <xsl:template match="span[@class='variable']">
        <xsl:variable name="lookup">
            <xsl:value-of select="@data-ref"/>
        </xsl:variable>
        <span>
            <xsl:value-of select="//div[@class=$lookup]/@data-value"/>
        </span>
    </xsl:template>
    <xsl:template match="node()">
        <xsl:copy>
            <xsl:copy-of select="@*"/>
            <xsl:apply-templates/>
        </xsl:copy>
    </xsl:template>
</xsl:stylesheet>

其输出为:

<html>
<div class="variables" style="display:none">
  <div class="var_1" data-value="variable 1 value"></div>
  <div class="var_2" data-value="variable 2 value"></div>
  <div class="var_3" data-value="variable 3 value"></div>
</div>
<div>
  <div>Var 1 Value: <span>variable 1 value</span></div>
  <div>Var 2 Value: <span>variable 2 value</span></div>
  <div>Var 3 Value: <span>variable 3 value</span></div>
</div>
</html

当然,您可以扩展它以包括一个模板,以剥离其类为div的{​​{1}},例如使其不存在于输出中或由模板处理。

答案 1 :(得分:0)

您可以将参数传递到XSLT样式表,该样式表会生成FOP格式的XSL-FO。

如果使用FOP进行XSLT转换,则格式为-param name value(请参见https://xmlgraphics.apache.org/fop/2.3/running.html)。如果您使用外部XSLT处理器生成传递给FOP的XSL-FO,则使用XSLT处理器所需的格式(将在其文档中指定)。

在格式化阶段,最接近可变文本的是fo:markerfo:table-marker,但是即使标记是在格式化开始之前设置的,可变性也来自于不知道分页符发生在哪里,直到文档已格式化。