xml xslt
存储数据,例如作为一个XForms / REST / XQuery的[XRX]架构(见的一部分相关主题今天),是常见的。 您可以查询,检索以这种方式存储的数据并将其序列化为所需的格式。 对于Web应用程序,开发人员可能希望允许用户以HTML格式(在他们的Web浏览器中查看)或PDF文件(下载以供以后使用)检索数据。
本文介绍如何可以从XSL-FO XML数据转换为HTML,到XSL-FO从HTML,并为PDF基础上,CSSToXSLFO工具的XQuery扩展功能的帮助下(参见相关主题 )。
将XML数据转换为其他格式
通常,您需要两个XSL样式表才能将数据从XML转换为HTML和XSL-FO:一个需要将XML转换为HTML和一个XSL-FO样式表才能将HTML转换为XSL-FO文档,然后您可以使用XSL-FO处理器。 此过程意味着在诸如以HTML和PDF生成报告的Web应用程序等环境中,您必须编写一个新的XSLT样式表,该样式表将数据转换为HTML,然后编写,调试和维护相应的XSL-FO样式表。 跟上这些样式表可能很困难,而且XSL-FO也不容易使用。 幸运的是,由于报告不必太复杂,因此您可以轻松地在CSS文件中表示布局。 然后,您可以使用CSSToXSLFO
实用程序进一步处理CSS文件,该实用程序只需少量编码即可生成XSL-FO文档。
对于本文介绍的方法,此过程和其他类似情况都是完美的用例-即,编写将XML转换为HTML的XSLT样式表,然后向其中添加一些额外CSS指令,以便将HTML转换为XSL- FO,然后转为PDF。
CSSToXSLFO实用程序
CSSToXSLFO
实用程序允许将XML文档以及CSS版本2(CSS2)样式表转换为XSL-FO文档。 为了使用该实用程序,我将eXist XML数据库的XQuery扩展功能开发为用于数字发布的XQuery扩展模块的一部分。
该实用程序处理大多数CSS2规范。 为了处理特定的XSL-FO功能,它提供了一些浏览器通常忽略CSS扩展指令。 在CSS样式表的@media
打印部分的@page
规则中使用这些属性。 这些属性与页面区域,编号,引用,领导者,命名字符串,连字符,脚注,外部图形和外部元素有关。 一定要看看说明书的CSSToXSLFO
实用程序(见相关信息 )有关的工具和完善的XSLT样式表,你的设计技巧的更多信息。
eXist XML数据库
eXist-db是完全使用XML技术构建的开源数据库管理系统。 除其他标准外,它还支持XQuery,XPath和XSLT。 eXist根据XML数据模型存储数据,并且与XQuery标准高度兼容。 XQuery以基于索引的方式处理存储的数据。 该数据库还具有基于Apache Lucene的全文索引。
eXist的XQuery引擎是可扩展的,因此eXist具有各种XQuery扩展模块。 这些模块提供了XQuery扩展功能,例如:
- 全局键值缓存
- 各种压缩操作
- 日期和时间类型的附加操作
- 对文件和目录的各种操作
- HTTP请求(XPath模块)
- 对数据库中存储的图像的操作,包括检索图像尺寸,创建缩略图和调整图像大小
- 访问和操作基于Java™命名和目录接口的目录,例如LDAP
- 发送文本或HTML电子邮件
- 安排工作并处理现有工作
- 针对关系数据库管理系统执行SQL操作
- 确定XML节点之间的差异
- XSL-FO渲染
- XProc功能
- 加密操作
eXist和CSSToXSLFO
都是用Java语言编写的。 在撰写本文时,eXist允许您使用Apache格式设置对象处理器(FOP)或RenderHouse XEP作为XSL-FO处理器。 请访问eXist网站以获取有关安装数据库的说明,以便您可以运行本文的示例。
用于数字出版的eXist模块
用于数字出版的eXist模块目前正在开发中,将来将包含更多功能。 目前,它具有html-to-xslfo()
函数,该函数有助于本文提供的方法。
该模块的目的是为数字发布所需的所有XQuery扩展功能提供一个单一来源,包括各种格式之间的转换,例如DocBook,Open XML,DOC,DOCX,.html,PDF,TXT,RTF,PPT, PPTX和CSV。 要在eXist中安装此模块:
- 下载eXist数字出版模块JAR,并将其复制到$ EXIST_HOME / lib / extensions中。
- 下载css2xslfo1_6_2.jar,并将其复制到$ EXIST_HOME / lib / user。
- 将
<module class="ro.kuberam.kPub.kPubModule" uri="http://kuberam.ro/k-Pub"/>
到$ EXIST_HOME / conf.xml文件的内置模块部分中。
例子
本节分析了CSSToXSLFO
的使用,因为它是在eXist的XQuery扩展模块中用于数字发布的。 为此,请使用清单1中提供的XML数据,以及可下载的代码示例中包含的XSLT样式表(xml-to-html.xsl)。
注意:为了使本文更易于阅读,我没有提供所用XSLT样式表的完整内容。 相反,我仅介绍使样式表适合将XML转换为HTML和PDF的那些元素。
这些示例将被上传到eXist XML数据库的eXist根集合中名为html-and-pdf-single-stylesheet的集合中,因此您可以在浏览器中查看每个示例。 例如,要查看示例1,请在浏览器的地址栏中键入以下URL(假设eXist安装在本地):
http://127.0.0.1:8080/rest/db/html-and-pdf-single-stylesheet/example%201/example1.xql
要使用CSSToXSLFO
工具中的更多功能,除了清单2和清单3中提供的XQuery代码外,您不需要任何其他XQuery代码,它们分别以HTML格式和PDF呈现XML数据。 要获取日益完善的PDF文档,必须将CSS指令添加到XSLT样式表CSS部分。
清单1.代表已发行发票摘要的XML文档(示例代码中的文件xml-data.xml)
<invoices-summary>
<invoice id="">
<issue-date>2011-10-17</issue-date>
<amount>108</amount>
<vat>19.47</vat>
<vat-base>22</vat-base>
<currency>EURO</currency>
<customer-id>0001008</customer-id>
</invoice>
<invoice id="">
<issue-date>2011-10-17</issue-date>
<amount>40</amount>
<vat>7.21</vat>
<vat-base>22</vat-base>
<currency>EURO</currency>
<customer-id>0000017</customer-id>
</invoice>
<invoice id="">
<issue-date>2011-10-17</issue-date>
<amount>1700</amount>
<vat>306.56</vat>
<vat-base>22</vat-base>
<currency>EURO</currency>
<customer-id>0000040</customer-id>
</invoice>
</invoices-summary>
清单2中的第一个示例是一个XQuery脚本,该脚本将清单1中显示的XML数据转换为HTML。 该脚本使用eXist的transform:transform()
函数,该函数依次使用XSLT样式表和(可选)用于转换的参数来转换XML数据。 您可以在XSLT 1.0(基于Apache Xalan)或XSLT 2.0(与Saxon一起使用)中编写XSLT样式表。
清单2.将XML数据转换为HTML的XQuery脚本(示例代码中的文件example-01.xql)
xquery version "1.0";
let $xml-data := doc('/db/html-and-pdf-single-stylesheet/xml-data.xml')
let $xslt-stylesheet := doc( '/db/html-and-pdf-single-stylesheet/xml-to-html.xsl' )
let $html := transform:transform($xml-data, $xslt-stylesheet, ())
return $html
图1显示了在我的浏览器中生成HTML文档的呈现。 HTML文档以非serif字体显示三个发票的详细信息摘要。 (查看图1和2中找到的格式化内容的文本版本 。)
图1.转换为HTML的结果
首先,如前面的示例所示,将XML数据转换为HTML。 生成HTML文档包含按预期呈现HTML文档所需的所有CSS指令,以及特定于CSSToXSLFO
CSS扩展指令,这将有助于使用XSL-FO的更复杂的功能。
对于一个简单的用例(如本文中介绍的用例),您不需要此类扩展说明。 CSSToXSLFO
实用程序将HTML文档转换为XSL-FO文档,而XSL-FO文档又生成了与HTML文档CSSToXSLFO
相似的PDF文档。
接下来,使用html-to-xslfo()
函数将生成HTML文档转换为XSL-FO文档,然后如清单3所示生成PDF文档。 要创建PDF,请使用xslfo
eXist模块的render()
函数。
清单3.将XML数据转换为PDF格式的XQuery脚本(示例代码中的文件example-02.xql)
xquery version "1.0";
declare namespace xslfo="http://exist-db.org/xquery/xslfo";
declare namespace k-Pub="http://kuberam.ro/k-Pub";
let $xml-data := doc('/db/html-and-pdf-single-stylesheet/xml-data.xml')
let $xslt-stylesheet := doc('/db/html-and-pdf-single-stylesheet/xml-to-html.xsl')
let $html := transform:transform($xml-data, $xslt-stylesheet, ())
let $fo := k-Pub:html-to-xslfo($html)
let $pdf := xslfo:render($fo, "application/pdf", ())
return response:stream-binary( $pdf, "application/pdf", "output.pdf" )
图2显示了在我的浏览器中渲染的结果PDF文档。 PDF文档以衬线字体显示了三个发票的详细信息摘要。 (查看图1和2中找到的格式化内容的文本版本 。)
图2.转换为PDF格式的结果
清单4包含在HTML和PDF中呈现XML数据所需CSS指令。 为了获得类似的PDF文件,我仅添加了一条CSS指令-使表头加粗。
清单4. CSS指令以相似的外观将XML呈现为HTML和PDF
body {
font-family: arial;
font-size: 12px;
text-align: center;
}
table {
border-collapse: collapse;
width: 100%;
border: solid black 1px;
}
table th, td {
border: solid black 1px;
}
@media screen {
body {
width: 570px;
}
}
@media print {
table th {
font-weight: bold;
}
}
结论
在本文中,您使用了一个简单函数,仅使用CSS语法的强大功能和简单性以及一些扩展指令来将XML数据转换为HTML和PDF格式,以处理更复杂的XSL-FO功能。 在具有简单样式的报表或文档的情况下,此方法特别有用。
翻译自: https://www.ibm.com/developerworks/web/library/x-xmlxsltpdf/index.html
xml xslt