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:marker
和fo: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
例如,使其不在输出中或由您的模板处理.
我尝试使用 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:marker
和fo: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
例如,使其不在输出中或由您的模板处理.