xml xslt_使用单个XSLT样式表以HTML和PDF发布XML数据

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中安装此模块:

  1. 下载eXist数字出版模块JAR,并将其复制到$ EXIST_HOME / lib / extensions中。
  2. 下载css2xslfo1_6_2.jar,并将其复制到$ EXIST_HOME / lib / user。
  3. <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的结果
该屏幕截图显示了转换为HTML的结果

首先,如前面的示例所示,将XML数据转换为HTML。 生成HTML文档包含按预期呈现HTML文档所需的所有CSS指令,以及特定于CSSToXSLFOCSS扩展指令,这将有助于使用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格式的结果
该屏幕截图显示了生成的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

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值