如何迭代 XSL FO 中的 json 数据?

How to iterate over json Data in XSL FO?

我正在尝试使用 Apache FOP 生成 pdf,我将接收 JSON 格式的输入数据。有没有办法循环 XSL-FO 中的 JSON 输入。

您需要将源 - JSON 数据,在您的情况下 - 转换为 XSL 格式化程序理解的 XSL-FO 词汇表中的 XML。

如果您想使用 XSLT 转换为 XSL-FO,您会发现使用 XSLT 3.0 处理器更容易做到这一点,因为 XSLT 3.0 添加了对转换的内置支持 JSON .参见,例如:

所以让我们在这里说清楚;您不能 "loop" 处理 XSL-FO 中的任何内容,就其本身而言。 XSL-FO 本质上是一种输出格式化规范语言。它不是该短语更丰富意义上的 "programming language"。在幕后进行循环 ('for each page, do this and this'),但这全部由引擎处理。您永远不会直接声明循环。

DO 所做的是使用 XSLT 将输入数据转换为 XSL-FO 来获取数据(大概是 XML 数据,但并非总是如此)。此 FO 是一种特殊的 XML 标记,PDF 引擎(如 FOP、Antenna House Formatter、RenderX、Ecrion 等)可以理解并用于格式化实际的 PDF。

XSLT 通过原始输入数据执行循环(由您明确编程)。

现在关于输入数据 JSON,正如 Tony Graham 所说,XSLT 3.0 使处理变得更加容易。

您可以查看一个不错的小博客 post here,它描述了使用 XSLT 3.0 从 JSON 到 XML 的过程。但是,您不必像博客中那样一直遍历并将地图转换为另一种更简洁的 XML 形式,您当然可以直接循环遍历地图元素以创建您的 FO。

现在就消除 JSON 到 XML 步骤而言,这在技术上是可以完成的,但会 far麻烦比声称你 'skipped the step' 更值得。该短语所暗示的效率会产生可怕的误导,因为它根本没有效率。您会看到 XSLT 将 JSON 作为文本文件作为输入,然后执行大量笨拙且不合理的字符串操作以直接从该 JSON 文本输出 FO,而不是制作事情 so 简单得多,执行利用 json-to-xml 函数的简单步骤,然后从XML 数据来生成你的 FO。

请记住,XSLT 在处理 XML 数据时处于最佳状态。这就是它首先设计的目的,而不是处理像 SED 或 AWK 这样的大规模字符串操作,举两个例子。尽管它可以采用不同的输入,例如 CSV 文件,但处理此类输入的最佳方式是最终将它们表示为 XML 输入,然后通过构建 FO 让 XSLT 真正发挥作用。

我希望这可以帮助您和其他人查看此 post 关于各种形式的可能输入数据、XSLT、XSL-FO 和 PDF 之间的关系。