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 định dạ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 định dạng HTML (để 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).
8 trang |
Chia sẻ: lylyngoc | Lượt xem: 2137 | Lượt tải: 3
Bạn đang xem nội dung tài liệu 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, để tải tài liệu về máy bạn click vào nút DOWNLOAD ở trê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 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 định dạ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 định dạng HTML (để 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ệu XML 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ệu XML sang các định dạng khác
Các từ viết tắt thông dụng
CSS: Cascading stylesheet (Bản định kiể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 định dạng của XSL)
XSLT: Extensible Stylesheet Language Transformations (Các chuyển đổi
Ngôn ngữ bản định kiểu mở rộng)
Thông thường, bạn cần hai bản định kiểu XSL để chuyển đổi dữ liệu từ XML sang
HTML và XSL-FO: một để chuyển đổi XML sang HTML và một bản định kiể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ụng mộ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ưới dạng HTML và PDF, thì bạn phải viết một bản định kiểu XSLT mới
để chuyển đổi dữ liệu sang HTML và sau đó viết, gỡ lỗi và bảo trì bản định kiểu
XSL-FO tương ứng. Khó có thể theo kịp các bản định kiể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ột bản định kiể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ột bả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ất bả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 định kiểu XSLT 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ệu XML 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ạn sử dụng FOP (Apache Formatting Objects
Processor – Bộ xử lý các đối tượng định dạ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ất bản số
Mô đun eXist dùng cho việc xuất bả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 duy nhất cho tất cả các hàm
mở rộng XQuery cần thiết cho việc xuất bả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, PPTX và CSV. Để cài đặt mô đun này trong eXist:
1. Tải về tệp JAR của mô đun xuất bả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=""/> 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ất bản số. Với nhiệm vụ
này, việc sử dụng dữ liệu XML đượ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ểu XSLT đã 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 định kiểu phù hợp với việc chuyển đổi XML sang HTML và 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):
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ệu XML tương ứng theo định dạng HTML và PDF.
Để có được các tài liệu PDF 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 định kiểu XSLT.
Liệt kê 1. Một tài liệu XML biểu diễn một bản tóm tắt của các hoá đơn đã
phát hành (tệp xml-data.xml trong mã ví dụ)
2011-10-17
108
19.47
22
EURO
0001008
2011-10-17
40
7.21
22
EURO
0000017
2011-10-17
1700
306.56
22
EURO
0000040
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ệu XML đượ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ệ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 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ệu XML 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ệu HTML kết quả trong trình duyệt của
tôi. Tài liệu HTML sẽ hiển thị một bả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 định dạ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ệu XML đượ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 khi sử 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ệu HTML 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ệu HTML 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ệu PDF 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ệu XML sang định dạng
PDF (tệp example-02.xql trong mã ví dụ)
xquery version "1.0";
declare namespace xslfo="";
declare namespace 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ệu PDF 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ột bả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 định dạng đã thấy trong Hình 1 và 2.)
Hình 2. Kết quả của phép chuyển đổi sang định dạng PDF
Liệt kê 4 chứa các chỉ lệnh CSS cần thiết để hiển thị dữ liệu XML 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ạng HTML và 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ụng một hàm đơn giản để chuyển đổi dữ liệu XML sang
cả hai định dạng HTML và 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.