Xuất bảndữliệuXMLdướidạngHTMLvàPDF khi sử dụng
một bảnđịnhkiểuXSLTduynhất
Việc lưu trữ dữ liệu, ví dụ như một phần của một kiến trúc XForms/REST/XQuery
[XRX] (xem phần Tài nguyên), thường thấy hiện nay. Bạn có thể truy vấn, lấy ra
và xếp tuần tự dữliệu được lưu trữ theo cách này sang địnhdạng mong muốn. Đối
với các ứng dụng web, các nhà phát triển có thể muốn cho phép người dùng lấy ra
dữ liệu theo địnhdạngHTML (để xem được trong trình duyệt web của mình) hoặc
làm một tệp PDF (để có thể tải về cho việc sửdụng sau này).
Bài này cho thấy làm thế nào để bạn có thể chuyển đổi dữliệuXML sang HTML,
từ HTML sang XSL-FO và từ XSL-FO sang PDF với sự trợ giúp của hàm mở rộng
XQuery dựa vào công cụ CSSToXSLFO (xem phần Tài nguyên).
Chuyển đổi dữliệuXML sang các địnhdạng khác
Các từ viết tắt thông dụng
CSS: Cascading stylesheet (Bản địnhkiểu xếp chồng)
HTTP: Hypertext Transfer Protocol (Giao thức truyền siêu văn bản)
JAR: Java archive (Tệp nén Java)
LDAP: Lightweight Directory Access Protocol (Giao thức truy cập thư mục
nhẹ)
SQL: Structured Query Language (Ngôn ngữ truy vấn có cấu trúc)
W3C: World Wide Web Consortium (Hiệp hội Mạng toàn cầu)
XSL-FO: Extensible Stylesheet Language Formatting Objects (Các đối
tượng địnhdạng của XSL)
XSLT: Extensible Stylesheet Language Transformations (Các chuyển đổi
Ngôn ngữ bảnđịnhkiểu mở rộng)
Thông thường, bạn cần hai bảnđịnhkiểu XSL để chuyển đổi dữliệu từ XML sang
HTML và XSL-FO: một để chuyển đổi XML sang HTMLvàmộtbảnđịnhkiểu
XSL-FO để chuyển đổi HTML sang một tài liệu XSL-FO, rồi bạn lại chuyển đổi
tài liệu XSL-FO này sang PDF bằng cách sửdụngmột bộ xử lý XSL-FO. Quá
trình này có nghĩa là trong một môi trường ví dụ như một ứng dụng web tạo ra các
báo cáo dướidạngHTMLvà PDF, thì bạn phải viết mộtbảnđịnhkiểuXSLT mới
để chuyển đổi dữliệu sang HTMLvà sau đó viết, gỡ lỗi và bảo trì bảnđịnhkiểu
XSL-FO tương ứng. Khó có thể theo kịp các bảnđịnhkiểu này và XSL-FO không
dễ làm việc với chúng. May mắn thay, vì các báo cáo này không quá phức tạp, nên
bạn có thể dễ dàng biểu diễn bố cục trong một tệp CSS. Sau đó, bạn có thể tiếp tục
xử lý tệp CSS bằng cách sửdụng tiện ích CSSToXSLFO, tiện ích này có thể tạo ra
tài liệu XSL-FO chỉ bằng một vài dòng mã.
Quá trình này và các tình huống khác hay tương tự là các trường hợp sửdụng hoàn
hảo cho cách tiếp cận mà bài này trình bày—cụ thể là, viết mộtbảnđịnhkiểu
XSLT để chuyển đổi XML sang HTML, sau đó thêm một số chỉ lệnh CSS bổ sung
sao cho nó có thể chuyển đổi HTML sang XSL-FO rồi sang PDF.
Về đầu trang
Tiện ích CSSToXSLFO
Tiện ích CSSToXSLFO cho phép chuyển đổi một tài liệu XML, cùng với mộtbản
định kiểu phiên bản CSS 2 (CSS2), thành một tài liệu XSL-FO. Để sửdụng tiện
ích này, tôi đã phát triển một hàm mở rộng XQuery cho cơ sở dữliệu eXist XML
như là một phần của mô đun mở rộng XQuery dùng cho việc xuấtbản số.
Tiện ích này xử lý hầu hết các đặc tả CSS2. Để xử lý các tính năng XSL-FO cụ
thể, nó cung cấp một số chỉ lệnh mở rộng CSS mà các trình duyệt thường bỏ qua.
Sử dụng các đặc tính này theo quy tắc @page của phần in @media trong bảnđịnh
kiểu CSS. Các đặc tính có liên quan đến các vùng trang, đánh số, các tài liệu tham
khảo, các dấu dẫn trang, các chuỗi có tên, dấu gạch nối, các ghi chú cuối trang, các
đồ họa bên ngoài và các phần tử bên ngoài. Hãy chắc chắn xem hướng dẫn sửdụng
tiện ích CSSToXSLFO (xem phần Tài nguyên) để biết thêm thông tin về công cụ
này và các thủ thuật để tinh chỉnh các bảnđịnhkiểuXSLT mà bạn thiết kế.
Về đầu trang
Cơ sở dữliệu eXist XML
eXist-db là một hệ thống quản lý cơ sở dữliệu nguồn mở được xây dựng hoàn toàn
bằng công nghệ XML. Nó hỗ trợ XQuery, XPath vàXSLT trong số các tiêu chuẩn
khác. eXist lưu trữ dữliệu theo mô hình dữliệuXML và hoàn toàn phù hợp với
tiêu chuẩn XQuery. Dữliệu đã lưu được xử lý bằng XQuery theo cách dựa trên chỉ
mục. Cơ sở dữliệu cũng có một chỉ mục toàn văn bản dựa trên Apache Lucene.
Công cụ XQuery của eXist có khả năng mở rộng, do đó eXist có các mô đun mở
rộng XQuery khác nhau. Các mô đun này cung cấp các hàm mở rộng XQuery,
chẳng hạn như các hàm dùng cho:
Bộ nhớ đệm giá trị-khóa chung (global).
Các phép toán nén khác nhau.
Các phép toán bổ sung về các kiểu ngày tháng và thời gian.
Các hoạt động khác nhau về các tệp và các thư mục.
Các yêu cầu HTTP (một mô đun XPath).
Các hoạt động dựa trên các hình ảnh được lưu trữ trong cơ sở dữ liệu, bao
gồm lấy ra các chiều hình ảnh, tạo các hình thu nhỏ và thay đổi kích cỡ hình
ảnh.
Việc truy cập và thao tác các thư mục dựa trên-giao diện Thư mục và Đặt
tên Java (Java™ Naming and Directory Interface), chẳng hạn như LDAP.
Việc gửi các thư điện tử HTML hoặc văn bản.
Việc lập lịch biểu các công việc và thao tác các công việc hiện tại.
Việc thực hiện các hoạt động SQL dựa vào hệ thống quản lý cơ sở dữliệu
quan hệ.
Việc xác định các sự khác biệt giữa các nút XML.
Hiển thị XSL-FO.
Chức năng XProc.
Các phép toán mã hóa.
Cả hai eXist và CSSToXSLFO đều được viết bằng ngôn ngữ Java. Tại thời điểm
viết bài này, eXist cho phép bạnsửdụng FOP (Apache Formatting Objects
Processor – Bộ xử lý các đối tượng địnhdạng của Apache) hoặc RenderHouse
XEP làm bộ xử lý XSL-FO. Xem trang web eXist để biết các chỉ lệnh về cách cài
đặt cơ sở dữliệu sao cho bạn có thể chạy các ví dụdùng cho bài này.
Mô đun eXist dùng cho việc xuấtbản số
Mô đun eXist dùng cho việc xuấtbản số hiện đang được phát triển và sẽ bao gồm
nhiều hàm hơn nữa trong tương lai. Bây giờ, nó có hàm html-to-xslfo(), giúp cho
cách tiếp cận được đưa ra trong bài này.
Mục đích đằng sau mô đun này là cung cấp một nguồn duynhất cho tất cả các hàm
mở rộng XQuery cần thiết cho việc xuấtbản số, bao gồm việc chuyển đổi giữa các
định dạng khác nhau, chẳng hạn như DocBook, Open XML, DOC, DOCX, .html,
PDF, TXT, RTF, PPT, PPTXvà CSV. Để cài đặt mô đun này trong eXist:
1. Tải về tệp JAR của mô đun xuấtbản số eXist và sao chép nó vào
$EXIST_HOME/lib/extensions.
2. Tải về tệp css2xslfo1_6_2.jar và sao chép nó vào $EXIST_HOME/lib/user.
3. Thêm <module class="ro.kuberam.kPub.kPubModule"
uri="http://kuberam.ro/k-Pub"/> vào phần các mô đun dựng sẵn trong tệp
$EXIST_HOME/conf.xml.
Về đầu trang
Các ví dụ
Phần này phân tích cách sửdụng CSSToXSLFO khi nó được triển khai thực hiện
trong mô đun mở rộng XQuery của eXist dùng cho việc xuấtbản số. Với nhiệm vụ
này, việc sửdụngdữliệuXML được trình bày trong Liệt kê 1, cùng với bảnđịnh
kiểu XSLT (xml-to-html.xsl) được đưa vào mã ví dụ có sẵn để tải về.
Lưu ý: Để làm cho bài này dễ đọc hơn, tôi đã bỏ qua toàn bộ các nội dung của bản
định kiểuXSLT đã sử dụng. Thay vào đó, tôi chỉ trình bày những phần tử nào làm
cho bảnđịnhkiểu phù hợp với việc chuyển đổi XML sang HTMLvà PDF.
Các ví dụ sẽ được tải lên một cơ sở dữliệu eXist XML trong một bộ sưu tập được
gọi là html-and-pdf-single-stylesheet nằm trong bộ sưu tập gốc của eXist, vì vậy
bạn có thể xem từng ví dụ trong trình duyệt của mình. Ví dụ, để xem ví dụ 1, hãy
gõ URL sau vào thanh địa chỉ của trình duyệt của bạn (giả sử eXist được cài đặt
cục bộ rồi):
http://127.0.0.1:8080/rest/db/html-and-pdf-single-
stylesheet/example%201/example1.xql
Để sửdụng thêm nhiều chức năng hơn nữa trong công cụ CSSToXSLFO, bạn
không cần bất kỳ mã XQuery khác nào ngoài đoạn mã được cung cấp trong Liệt kê
2 và Liệt kê 3, đã hiển thị dữliệuXML tương ứng theo địnhdạngHTMLvà PDF.
Để có được các tài liệuPDF ngày càng hoàn thiện hơn, bạn phải thêm các chỉ lệnh
CSS cho phần CSS của bảnđịnhkiểu XSLT.
Liệt kê 1. Một tài liệuXML biểu diễn mộtbản tóm tắt của các hoá đơn đã
phát hành (tệp xml-data.xml trong mã ví dụ)
<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>
Ví dụ đầu tiên, trong Liệt kê 2, là một kịch bản lệnh XQuery dùng để chuyển đổi
dữ liệuXML được trình bày trong Liệt kê 1 sang HTML. Kịch bản lệnh sửdụng
hàm transform:transform() của eXist, hàm này lần lượt chuyển đổi dữliệuXML
bằng cách sử dụngmộtbảnđịnhkiểuXSLT và (theo tùy chọn) sửdụng các tham
số để chuyển đổi. Bạn có thể viết bảnđịnhkiểuXSLT theo XSLT 1.0 (dựa trên
Apache Xalan) hoặc XSLT 2.0 (tùy chọn với Saxon).
Liệt kê 2. Kịch bản lệnh XQuery chuyển đổi dữliệuXML sang HTML (tệp
example-01.xql trong mã ví dụ)
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
Hình 1 cho thấy phần trình bày của tài liệuHTML kết quả trong trình duyệt của
tôi. Tài liệuHTML sẽ hiển thị mộtbản tóm tắt các chi tiết cho ba hoá đơn theo một
phông chữ không là serif (Xem một phiên bản văn bản về nội dungđịnhdạng đã
thấy trong Hình 1 và 2.)
Hình 1. Kết quả của phép chuyển đổi sang HTML
Đầu tiên, dữliệuXML được chuyển đổi sang HTML, như trong ví dụ trước. Tài
liệu HTML kết quả có chứa tất cả các chỉ lệnh CSS cần thiết để trình bày tài liệu
HTML như dự kiến, cùng với các chỉ lệnh mở rộng CSS đặc trưng cho
CSSToXSLFO, mà nó sẽ trợ giúp trong khisửdụng các tính năng phức tạp hơn
của XSL-FO.
Đối với trường hợp sửdụng đơn giản như trường hợp được trình bày trong bài này,
bạn không cần các chỉ lệnh mở rộng như vậy. Tiện ích CSSToXSLFO chuyển đổi
tài liệuHTML thành một tài liệu XSL-FO, rồi tài liệu này lần lượt tạo ra một tài
liệu PDF sẽ rất giống tài liệu HTML.
Tiếp theo, bạn chuyển đổi tài liệuHTML kết quả sang một tài liệu XSL-FO bằng
cách sửdụng hàm html-to-xslfo(), rồi tạo ra một tài liệuPDF như trong Liệt kê 3.
Để tạo PDF, hãy sửdụng hàm render() của mô-đun eXist xslfo.
Liệt kê 3. Kịch bản lệnh XQuery chuyển đổi dữliệuXML sang địnhdạng
PDF (tệp example-02.xql trong mã ví dụ)
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" )
Hình 2 cho thấy tài liệuPDF kết quả đã hiển thị trong trình duyệt của tôi. Tài liệu
PDF trình bày mộtbản tóm tắt chi tiết cho ba hoá đơn theo một phông chữ serif.
(Xem một phiên bản văn bản về nội dungđịnhdạng đã thấy trong Hình 1 và 2.)
Hình 2. Kết quả của phép chuyển đổi sang địnhdạngPDF
Liệt kê 4 chứa các chỉ lệnh CSS cần thiết để hiển thị dữliệuXML theo cả hai dạng
HTML và PDF. Để có được một tệp PDF tương tự, tôi chỉ thêm vào một chỉ lệnh
CSS—để thực hiện in đậm các tiêu đề bảng.
Liệt kê 4. Các chỉ lệnh CSS để hiển thị XML theo cả hai dạngHTMLvàPDF
với một diện mạo tương tự
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;
}
}
Về đầu trang
Kết luận
Trong bài này, bạn đã sửdụngmột hàm đơn giản để chuyển đổi dữliệuXML sang
cả hai địnhdạngHTMLvàPDF bằng cách sửdụng sức mạnh vàsự đơn giản của
cú pháp CSS vàmột số chỉ lệnh mở rộng để xử lý những tính năng XSL-FO phức
tạp hơn. Đặc biệt là cách tiếp cận này có ích trong các tình huống mà ở đó bạn có
các báo cáo hoặc các tài liệu có phong cách đơn giản.
. Xuất bản dữ liệu XML dưới dạng HTML và PDF khi sử dụng
một bản định kiểu XSLT duy nhất
Việc lưu trữ dữ liệu, ví dụ như một phần của một kiến. đổi dữ liệu XML
bằng cách sử dụng một bản định kiểu XSLT và (theo tùy chọn) sử dụng các tham
số để chuyển đổi. Bạn có thể viết bản định kiểu XSLT theo XSLT