首页 | 新闻 | 新品 | 文库 | 方案 | 视频 | 下载 | 商城 | 开发板 | 数据中心 | 座谈新版 | 培训 | 工具 | 博客 | 论坛 | 百科 | GEC | 活动 | 主题月 | 电子展
返回列表 回复 发帖

使用单个 XSLT 样式表发布 HTML 和 PDF 格式的 XML 数据(2)

使用单个 XSLT 样式表发布 HTML 和 PDF 格式的 XML 数据(2)

示例 本节分析 CSSToXSLFO 的用法,因为它是在 eXist 用于数字发布的 XQuery 扩展模块中实现的。对于此任务,使用  中提供的 XML 数据,以及  部分提供的代码示例中包含的 XSLT 样式表 (xml-to-html.xsl)。
备注:为了使本文更容易阅读,我没有包含所使用的 XSLT 样式表的完整内容。相反,我仅提供了那些使该样式表适合将 XML 转换为 HTML 和 PDF 的元素。
这些示例将上传到一个 eXist XML 数据库中,该数据库位于 eXist 根集合中的一个名为 html-and-pdf-single-stylesheet 的集合中,所以您可在浏览器中查看每个示例。例如,要查看示例 1,可在浏览器地址栏中键入以下地址(假设 eXist 安装在本地):
1
http://127.0.0.1:8080/rest/db/html-and-pdf-single-stylesheet/example%201/example1.xql




要使用 CSSToXSLFO 工具中的更多功能,您只需要  和  中提供的 XQuery 代码,它们分别以 HTML 和 PDF 格式呈现代码。要获得更加完善的 PDF 文档,您必须向 XSLT 样式表的 CSS 部分添加 CSS 指令。
清单 1. 一个表示已开具发票的摘要的 XML 文档(示例代码中的文件 xml-data.xml)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
<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>




第一个示例(如  所示)是一段 XQuery 脚本,它将  中给出的 XML 数据转换为 HTML。该脚本使用了 eXist 的 transform:transform() 函数,后者使用一个 XSLT 样式表和(可选的)转换参数来转换 XML 数据。您可以使用 XSLT 1.0(基于 Apache Xalan)或 XSLT 2.0(可选 Saxon)编写 XSLT 样式表。
清单 2. 将 XML 数据转换为 HTML 的 XQuery 脚本(示例代码中的文件 example-01.xql)
1
2
3
4
5
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




显示了结果 HTML 文档在浏览器中的呈现效果。该 HTML 文档以一种非 serif 字体显示 3 个发票的细节摘要。(参见 。)
图 1. 转换为 HTML 的结果 首先,与在上一个示例中一样,将 XML 数据转换为了 HTML。结果 HTML 文档包含按要求呈现 HTML 文档所需的所有 CSS 指令,以及特定于 CSSToXSLFO 并有助于使用更复杂的 XSL-FO 功能的 CSS 扩展指令。
对于如本文中所示的简单用例,您不需要这些扩展指令。CSSToXSLFO 实用工具将 HTML 文档转换为一个 XSL-FO 文档,后者进而生成一个将非常类似于 HTML 文档的 PDF 文档。
接下来,您使用 html-to-xslfo() 函数将结果 HTML 文档转换为一个 XSL-FO 文档,然后生成一个 PDF 文档,如  中所示。要创建 PDF,可使用 xslfo eXist 模块的 render() 函数。
清单 3. 将 XML 数据转换为 PDF 格式的 XQuery 脚本(示例代码中的文件 example-02.xql)
1
2
3
4
5
6
7
8
9
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" )




显示了结果 PDF 文档在浏览器中的呈现效果。该 PDF 文档以一种 serif 格式显示 3 个发票的细节摘要。(请参见 。)
图 2. 转换成 PDF 格式的结果 包含以 HTML 和 PDF 格式呈现 XML 所需的 CSS 指令。为了获得一个类似的 PDF 文件,我仅添加了一个 CSS 指令,将表标题加粗。
清单 4. 将 XML 呈现为具有类似外观的 HTML 和 PDF 的 CSS 指令
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
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;
    }
}

返回列表