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

XSL FO Pass dynamic value from the HTML to XSLT variable

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

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

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

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

不清楚您可以在什么时候注入 "variables" 也不清楚您希望如何注入。下面是一个可能会提供一些灵感的示例。它只使用一个简单的 identity-translate 并为简洁起见省略了所有 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>

并且您修改 XSL 以获得与要插入变量的 span 相匹配的模板:

<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 的 class 是 variables 例如,使其不在输出中或由您的模板处理.