- c - 在位数组中找到第一个零
- linux - Unix 显示有关匹配两种模式之一的文件的信息
- 正则表达式替换多个文件
- linux - 隐藏来自 xtrace 的命令
我们有一个基于 Java 的系统,它从数据库中读取数据,将各个数据字段与预设 XSL-FO
合并标记并将结果转换为 PDF
与 Apache FOP
.
在XSL-FO
格式如下:
<?xml version="1.0" encoding="utf-8" ?>
<!DOCTYPE Html [
<!ENTITY nbsp " ">
<!-- all other entities -->
]>
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns:fo="http://www.w3.org/1999/XSL/Format">
<xsl:output method="xml" indent="yes" />
<xsl:template match="/">
<fo:root xmlns:fo="http://www.w3.org/1999/XSL/Format" xmlns:svg="http://www.w3.org/2000/svg" font-family="..." font-size="...">
<fo:layout-master-set>
<fo:simple-page-master master-name="Letter Page" page-width="8.500in" page-height="11.000in">
<!-- appropriate settings -->
</fo:simple-page-master>
</fo:layout-master-set>
<fo:page-sequence master-reference="Letter Page">
<!-- some static content -->
<fo:flow flow-name="xsl-region-body">
<fo:block>
<fo:table ...>
<fo:table-column ... />
<fo:table-body>
<fo:table-row>
<fo:table-cell ...>
<fo:block text-align="...">
<fo:inline font-size="..." font-weight="...">
<!-- Header / Title -->
</fo:inline>
</fo:block>
</fo:table-cell>
</fo:table-row>
</fo:table-body>
</fo:table>
</fo:block>
<fo:block>
<fo:table ...>
<fo:table-column ... />
<fo:table-body>
<fo:table-row>
<fo:table-cell>
<fo:block ...>
<!-- Field A -->
</fo:block>
</fo:table-cell>
</fo:table-row>
</fo:table-body>
</fo:table>
<!-- Other fields in a very similar fashion as the above "Field A" -->
</fo:block>
</fo:flow>
</fo:page-sequence>
</fo:root>
</xsl:template>
</xsl:stylesheet>
现在我正在寻找一种允许某些字段包含静态HTML 格式 内容的方法。此内容将由我们支持 HTML 的编辑器生成(类似于 CLEditor
、CKEditor
等)或从外部粘贴。
我的计划是遵循食谱 from this JavaWorld article :
JTidy
将 HTML 格式的字符串转换为正确的 XHTML 我有此类代码的基本版本,但出现以下错误:
(Location of error unknown)org.apache.fop1.fo.ValidationException: "{http://www.w3.org/1999/XSL/Format}table-body" is not a valid child of "fo:block"! (No context info available)
我的问题:
<fo:block>
充当通用容器,其中嵌套了其他对象(包括表格)?如果有人“在那里做过那件事”,请分享您的经验。
最佳答案
如果您在 oXygen 或 XML Spy 中使用 XSLT 调试器,则可以逐步完成转换。使用 oXygen——不确定 XML Spy 或其他编辑器——如果您单击调试器输出中的标记,oXygen 会突出显示来自源代码和生成该节点的样式表的标记。
一旦您拥有 FO,focheck 框架 ( https://github.com/AntennaHouse/focheck ) 就拥有目前可用的最完整的 FO 验证。
fo:block
可以包含表格等。在 XSL 1.1 规范中,每个 FO 的定义都包含一个“内容”小节,其中列出了其允许的内容。参见,例如 http://www.w3.org/TR/xsl11/#fo_block .内容模型中“参数实体”的定义位于 http://www.w3.org/TR/xsl11/#d0e6532。 , 但一些 FO 在其定义的文本中有额外的限制。
您引用的文章似乎没有“使用 XPath 提取根下的所有节点”步骤,我不确定您为什么需要它。除此之外,它看起来是使用 Java 完成这项工作的合理方法。
不是将从 JTidy 编辑的 HTML 转换而来的 FO 插入静态 FO,而是可以替换 <!-- Field A -->
使用非 FO 标记提供足够的信息来引用要插入的字段。然后,您可以制作一个 XSLT 样式表,通过对 FO 部分进行恒等变换,将模板+引用文档转换为直接 FO——正如@kevin-brown 的回答——并使用引用标记中的信息构建与 document()
一起使用的 URI函数 ( http://www.w3.org/TR/xslt#document ) 查找要插入的标记。
如果字段内容的 FO 位于磁盘上,则使用 document()
很简单。如果不是,那么您必须执行一些操作,例如覆盖 XSLT 处理器使用的 URIResolver,这样它就可以正确地检索内容,而不是在磁盘上查找。您甚至可以让 JTidying 作为 URIResolver 检索 HTML 的一部分发生。您也可以在 URIResolver“内部”对 FO 进行转换,或者也像@kevin-brown 建议的那样,将其作为单独的模式进行。如果转换是在 URIResolver 检索 FO 之前或期间完成的,那么模板+对 FO 的引用的“主要”转换只需要提取 FO 子文档的正确部分,例如document('constructed-URI')/fo:root/fo:page-sequence/*
.但是,如果您从 Antenna House 修改样式表,那么您应该能够修改它以不生成外部 fo:root
。等等。
几年前我做了类似的事情,为基于 XSLT 的服务器覆盖了 libxslt XSLT 处理器的 URI 解析器:内部 XSLT 处理器连续运行的上下文被保存为特殊 URI 的文档,不一定写入到文件系统。
相反,您可以编写一个扩展函数来查找对字段的引用。例如,Print and Page Layout Community Group @ W3C 已经为多个 XSLT 处理器生成了扩展函数,这些处理器在 XSLT 转换的中间运行一个 FO 处理器,以获取格式化结果的区域树的 XML。参见 http://www.w3.org/community/ppl/wiki/XSLTExtensions
关于java - 带有嵌入式 HTML 的 PDF 报告,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32789541/
我正在编写一个具有以下签名的 Java 方法。 void Logger(Method method, Object[] args); 如果一个方法(例如 ABC() )调用此方法 Logger,它应该
我是 Java 新手。 我的问题是我的 Java 程序找不到我试图用作的图像文件一个 JButton。 (目前这段代码什么也没做,因为我只是得到了想要的外观第一的)。这是我的主课 代码: packag
好的,今天我在接受采访,我已经编写 Java 代码多年了。采访中说“Java 垃圾收集是一个棘手的问题,我有几个 friend 一直在努力弄清楚。你在这方面做得怎么样?”。她是想骗我吗?还是我的一生都
我的 friend 给了我一个谜语让我解开。它是这样的: There are 100 people. Each one of them, in his turn, does the following
如果我将使用 Java 5 代码的应用程序编译成字节码,生成的 .class 文件是否能够在 Java 1.4 下运行? 如果后者可以工作并且我正在尝试在我的 Java 1.4 应用程序中使用 Jav
有关于why Java doesn't support unsigned types的问题以及一些关于处理无符号类型的问题。我做了一些搜索,似乎 Scala 也不支持无符号数据类型。限制是Java和S
我只是想知道在一个 java 版本中生成的字节码是否可以在其他 java 版本上运行 最佳答案 通常,字节码无需修改即可在 较新 版本的 Java 上运行。它不会在旧版本上运行,除非您使用特殊参数 (
我有一个关于在命令提示符下执行 java 程序的基本问题。 在某些机器上我们需要指定 -cp 。 (类路径)同时执行java程序 (test为java文件名与.class文件存在于同一目录下) jav
我已经阅读 StackOverflow 有一段时间了,现在我才鼓起勇气提出问题。我今年 20 岁,目前在我的家乡(罗马尼亚克卢日-纳波卡)就读 IT 大学。足以介绍:D。 基本上,我有一家提供簿记应用
我有 public JSONObject parseXML(String xml) { JSONObject jsonObject = XML.toJSONObject(xml); r
我已经在 Java 中实现了带有动态类型的简单解释语言。不幸的是我遇到了以下问题。测试时如下代码: def main() { def ks = Map[[1, 2]].keySet()
一直提示输入 1 到 10 的数字 - 结果应将 st、rd、th 和 nd 添加到数字中。编写一个程序,提示用户输入 1 到 10 之间的任意整数,然后以序数形式显示该整数并附加后缀。 public
我有这个 DownloadFile.java 并按预期下载该文件: import java.io.*; import java.net.URL; public class DownloadFile {
我想在 GUI 上添加延迟。我放置了 2 个 for 循环,然后重新绘制了一个标签,但这 2 个 for 循环一个接一个地执行,并且标签被重新绘制到最后一个。 我能做什么? for(int i=0;
我正在对对象 Student 的列表项进行一些测试,但是我更喜欢在 java 类对象中创建硬编码列表,然后从那里提取数据,而不是连接到数据库并在结果集中选择记录。然而,自从我这样做以来已经很长时间了,
我知道对象创建分为三个部分: 声明 实例化 初始化 classA{} classB extends classA{} classA obj = new classB(1,1); 实例化 它必须使用
我有兴趣使用 GPRS 构建车辆跟踪系统。但是,我有一些问题要问以前做过此操作的人: GPRS 是最好的技术吗?人们意识到任何问题吗? 我计划使用 Java/Java EE - 有更好的技术吗? 如果
我可以通过递归方法反转数组,例如:数组={1,2,3,4,5} 数组结果={5,4,3,2,1}但我的结果是相同的数组,我不知道为什么,请帮助我。 public class Recursion { p
有这样的标准方式吗? 包括 Java源代码-测试代码- Ant 或 Maven联合单元持续集成(可能是巡航控制)ClearCase 版本控制工具部署到应用服务器 最后我希望有一个自动构建和集成环境。
我什至不知道这是否可能,我非常怀疑它是否可能,但如果可以,您能告诉我怎么做吗?我只是想知道如何从打印机打印一些文本。 有什么想法吗? 最佳答案 这里有更简单的事情。 import javax.swin
我是一名优秀的程序员,十分优秀!