在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
>从Antenna House进一步修改xhtml2fo.xsl,以删除所有文档范围和页面范围的转换
>将此修改的XSLT应用于我的XHTML字符串(javax.xml.transform)
>使用XPath(javax.xml.xpath)解压根下的所有节点
>将结果直接提供给现有的XSL-FO文档
(Location of error unknown)org.apache.fop1.fo.ValidationException:
“{07002}table-body” is not a valid child
of “fo:block”! (No context info available)
我的问题:
>解决这个问题的方法是什么?
> Can< fo:block>用作嵌套在其中的其他对象(包括表)的通用容器?
这是解决任务的总体合理方法吗?
如果有人已经“在那里做了”,请分享你的经验.
解决方法
在你的情况下,你显然有一个fo:table-body作为fo:block的小孩.它不可能是.一个fo:table-body只有一个有效的父类,fo:table.您将丢失fo:table标签,或者您错误地将fo:block插入到此位置.
在我看来,我可能做的事情略有不同.我会把XHTML内容放在你想要的XSL FO里面.然后,我将创建一个身份转换,复制所有基于fo的内容,但是使用XSL转换XHTML部分.这样,您可以在XSL编辑器(如oXygen)中实际进行该转换,并查看发生错误的原因以及为什么.像其他任何人一样.
注意:您也可以查看其他XSL,特别是如果您的HTML可能有任何style =“”CSS属性.如果是这种情况,它不是简单的HTML,那么您将需要一个更好的方法来处理HTML到CSS.
http://www.cloudformatter.com/css2pdf是基于这个完整的转换.一般样式表可在这里:http://xep.cloudformatter.com/doc/XSL/xeponline-fo-translate-2.xsl
我是那个样式表的作者.它比你所要求的要多得多,但是将一个相当复杂的解析递归用于将CSS样式转换为XSL FO属性.