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

使用单个 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;
}
}
|
|
|
|
|
|
|