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



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

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

如果要使用 XSLT 进行转换为 XSL-FO,您会发现如果使用 XSLT 3.0 处理器,这更容易实现,因为 XSLT 3.0 添加了对转换 JSON 的内置支持。 参见,例如:

  • https://www.w3.org/TR/xslt-30/#json
  • https://www.w3.org/TR/xpath-functions/#json

所以让我们在这里说清楚;你不能"循环"XSL-FO中的任何内容,本身。 XSL-FO 本质上是一种输出格式规范语言。 它不是该短语更丰富意义上的"编程语言"。 幕后有循环("对于每个页面,做这个和这个"(,但这都是由引擎处理的。 您永远不会直接声明循环。

您要做的是使用 XSLT 将输入数据转换为 XSL-FO,以接收数据(可能是 XML 数据,但并非总是如此(。 此 FO 是一种特殊的 XML 标记,PDF 引擎(如 FOP、Antenna House 格式化程序、RenderX、Ecrioon 等(可以理解并用于格式化实际的 PDF。

XSLT 通过原始输入数据执行循环(由您显式编程(。

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

这里有一篇不错的小博客文章,您可以查看它描述了使用 XSLT 3.0 从 JSON 到 XML 的过程。 但是,您当然可以直接遍历地图元素来创建FO,而不是像博客中那样将映射转换为不同的,更整洁的XML形式。

现在,就消除JSON到XML步骤而言,这在技术上是可以做到的,但比仅仅声称您"跳过该步骤"要麻烦得多。 这句话所暗示的效率将具有可怕的误导性,因为它根本没有效率。 您将看到 XSLT 将 JSON 作为文本文件作为输入,然后执行大量笨拙且不合理的字符串操作以直接从该 JSON 文本输出 FO,而不是使事情变得如此简单并执行利用json-to-xml函数的简单步骤,然后从该 XML 数据开始生成您的 FO。

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

我希望这能帮助你和任何查看这篇文章的人了解各种形式的可能输入数据、XSLT、XSL-FO 和 PDF 之间的关系。

最新更新