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

Chuyển đổi dễ dàng và nhanh chóng dữ liệu XML sang HTML và PDF

Tìm hiểu cách xuất bản các tài liệu XML dưới dạng HTML và PDF khi sử dụng tiện ích css2xslfo.

Claudius Teodorescu, Chuyên viên cố vấn XML, Independent author

Ảnh của Claudius TeodorescuClaudius Teodorescu là một nhà tư vấn XML có trụ sở tại Bucharest, Romania. Ông có hơn 7 năm kinh nghiệm với XML, XForms, XPath, XSLT và XSD. Bạn có thể liên hệ với ông tại claudius.teodorescu@gmail.com.



14 01 2013

Điều kiện tiên quyết

Nếu bạn đã quen với ngôn ngữ XML và các tiêu chuẩn W3C thì đó chính là lợi thế của bạn. Để chạy các ví dụ trong bài này, hãy cài đặt cơ sở dữ liệu eXist XML (XML của eXist) cùng với hàm mở rộng XQuery của nó dùng cho việc xuất bản số. Xem phần Tài nguyên.

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.


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ế.


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="http://kuberam.ro/k-Pub"/> vào phần các mô đun dựng sẵn trong tệp $EXIST_HOME/conf.xml.

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):

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ê 2Liệ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ụ)
<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ệ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.)

Ảnh chụp màn hình cho thấy 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="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ệ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.)

Ảnh chụp màn hình cho thấy tài liệu PDF kết quả

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; 
    } 
}

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.


Tải về

Mô tảTênKích thước
Complete code exampleshtml-and-pdf-single-stylesheet.zip4KB

Tài nguyên

Học tập

Lấy sản phẩm và công nghệ

Thảo luận

Bình luận

developerWorks: Đăng nhập

Các trường được đánh dấu hoa thị là bắt buộc (*).


Bạn cần một ID của IBM?
Bạn quên định danh?


Bạn quên mật khẩu?
Đổi mật khẩu

Bằng việc nhấn Gửi, bạn đã đồng ý với các điều khoản sử dụng developerWorks Điều khoản sử dụng.

 


Ở lần bạn đăng nhập đầu tiên vào trang developerWorks, một hồ sơ cá nhân của bạn được tạo ra. Thông tin trong bản hồ sơ này (tên bạn, nước/vùng lãnh thổ, và tên cơ quan) sẽ được trưng ra cho mọi người và sẽ đi cùng các nội dung mà bạn đăng, trừ khi bạn chọn việc ẩn tên cơ quan của bạn. Bạn có thể cập nhật tài khoản trên trang IBM bất cứ khi nào.

Thông tin gửi đi được đảm bảo an toàn.

Chọn tên hiển thị của bạn



Lần đầu tiên bạn đăng nhập vào trang developerWorks, một bản trích ngang được tạo ra cho bạn, bạn cần phải chọn một tên để hiển thị. Tên hiển thị của bạn sẽ đi kèm theo các nội dung mà bạn đăng tải trên developerWorks.

Tên hiển thị cần có từ 3 đến 30 ký tự. Tên xuất hiện của bạn phải là duy nhất trên trang Cộng đồng developerWorks và vì lí do an ninh nó không phải là địa chỉ email của bạn.

Các trường được đánh dấu hoa thị là bắt buộc (*).

(Tên hiển thị cần có từ 3 đến 30 ký tự)

Bằng việc nhấn Gửi, bạn đã đồng ý với các điều khoản sử dụng developerWorks Điều khoản sử dụng.

 


Thông tin gửi đi được đảm bảo an toàn.


static.content.url=http://www.ibm.com/developerworks/js/artrating/
SITE_ID=70
Zone=Information Management
ArticleID=854888
ArticleTitle=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
publish-date=01142013