Thứ Sáu, 11 tháng 11, 2016

XSL trong ứng dụng thực tiễn

XSL trong ứng dụng thực tiễn

Mục đích: Chủ đề của bài này giới thiệu về việc áp dụng XSL trong thực tế khi ứng dụng và các kỹ thuật nâng cao để tận dụng triệt để sức mạnh của XSL trong việc chuyển đổi tài liệu và hạn chế viết code trong quá trình xây dựng phần mềm để tăng tính uyển chuyển trong việc nâng cấp và bảo trì ứng dụng. Cụ thể, chúng ta sẽ tìm hiểu cách xử lý khi áp dụng xsl với tài liệu xml sử dụng Unicode; áp dụng xml và xsl ở phía client sử dụng truyền tham số trực tiếp vào xsl để hạn chế code xử lý; kết hợp nhiều xml vào trong một xsl trong bài toán xử lý hóa đơn; tận dụng cài đặt các template trong xsl như là một method trong class để gọi lại nhiều lần trong xsl cùng với việc xử lý chuỗi trong tài liệu xsl; apply một tài liệu xsl với tài liệu xml có namespace

Yêu cầu về kiến thức cơ bản

Áp dụng XSL với tài liệu XML có hỗ trợ Unicode

  • Tài liệu XML

  • Tài liệu XSL

  • Code apply XML với XSL

  • Clean and Build, Deploy và chạy ứng dụng, chúng ta sẽ nhận được kết quả như sau

  • Vấn đế ở đây về mặt logic có tính bất hợp lý vì XML đã có encoding là UTF-8 nghĩa là output của bộ parser là Unicode, XSL cũng được output là dạng UTF-8 nhưng khi apply vào nhau thì không thể ra unicode
    • Tổng quan vấn đề có thể thấy rằng đó là việc xử lý trên các thành phần của web server đã làm biến đổi bản chất của tài liệu, cụ thể đây là thư viện của JSTL
    • Việc giải quyết xử lý ở đây chính là xử lý output các thư viện xử lý trên web server, cụ thể ở đây chính là dòng import tài liệu xml trong jsp
  • Cách xử lý
    • Chúng ta cần phải bổ sung thêm charEncoding là UTF-8 trong dòng import tài liệu JSP trong xml

    • Bên cạnh đó, đôi lúc ở một số version server và jdk có thể gây nên vấn đề tương tự. Để đảm bảo an toàn, chúng ta có thể bổ sung UTF-8 trong XSL và dòng import XSL trong code JSP
      • Code XSL

      • Code JSP

    • Kết quả của chúng ta sẽ nhận được như sau

Áp dụng tài liệu XML với XSL trực tiếp tại Client có áp dụng truyền tham số

  • Tài liệu XML

  • Tài liệu XSL với việc truyền tham số để search những item thòa điều kiện giá tiền lớn hơn tham số được truyền vào bên trong XSL
      • Đây là cách viết XSL nâng cao áp dụng XPath để thực hiện apply XSL cùng với lọc dữ liệu trực tiếp để nhằm hạn chế viết code trên các ngôn ngữ nhằm tạo giao diện linh hoạt khi bảo trì và nâng cấp

  • Code xử lý ở client được render từ server trả về cho browser

  • Kết quả thực thi khi clean and build, deploy và test ứng dụng

Kết hợp Nhiều XML với một tài liệu XSL

  • Đây là hình ảnh chúng ta cần kết xuất dữ liệu để tạo ra hóa đơn cho khách hàng. Về mặt tổng quan sử dụng Database, khi tạo ra hóa đơn để kết xuất chúng ta cần sự liên kết dữ liệu của bảng Customer, bảng Order, bảng Order Details, bảng Product để đưa ra được từng hóa đơn của khách hàng
  • Nhìn về kết xuất dữ liệu, chúng ta sẽ chuyển đổi từng bảng một thành các file XML riêng biệt. Bên cạnh đó, XSL hóa đơn là một tài liệu duy nhất. Vậy làm sao để kết hợp nhiều XML vào một XSL vì bản chất XSL đang sử dụng XPath, XPath lại chỉ xử lý được một tài liệu XML tại một thời điểm và không cần xác định context cụ thể đang xử lý?
  • Cách giải quyết vấn đề cụ thể như sau
    • Xác định một tài liệu XML chính để áp dụng cho XSL và viết XPath như bình thường
    • Các tài liệu XML còn lại xem như là tham số truyền vào XSL
    • Vấn đề gặp phải ở đây, đó là XSL và XPath chỉ xử lý các gì được gọi là node
    • Do vậy, nguyên lý ở đây chúng ta sẽ sử dụng XPath function để chuyển đổi tài liệu thành cây DOM và lưu lại thành biến trong XSL
    • Sau đó, dùng XPath để truy vấn trực tiếp trên biến này – hay cụ thể hơn là con trỏ root của cây DOM. Qua đó, chúng ta có thể viết các điều kiện để kết nối và lọc giữa các tài liệu với nhau
  • Ví dụ: Tạo report tất cả các hóa đơn trong hệ thống
    • Tài liệu XML – đặt tại thư mục WEB-INF
      • Danh sách khách hàng - customer.xml

      • Danh mục sản phẩm – product.xml

      • Tất cả hóa đơn – order.xml

      • Danh sách các chi tiết hóa đơn – orderDetails.xml

    • Tài liệu XSL xuất ra order report
      • Chúng ta sẽ kết xuất order giữa trên các điều kiện ràng buộc có kết nối với giữa order với các thành phần order Details, customer và product theo cách tương tự truy vấn join bảng trong DB để đưa kết xuất dữ liệu.
      • Chúng ta sẽ dùng điều kiện truy vấn XPath để thực hiện vấn đề nêu trên tương tự cách thức viết sub query trong DB

    • Code xử lý để transform nhiều XML với một XSL

      • Chúng ta xác định order là đối tượng chính, các thành phần còn lại được xem như là tham số hỗ trợ thực hiện trình bày các giá trị thay thế cho các id
    • Thực thi ứng dụng, chúng ta có được kết quả như sau

Thực hiện cài đặt template như là một method trong class Object

  • Tổng quát của cách thức này là xem template trong xsl như là một method trong việc xây dựng class. Ngoài ra, thông qua cách thức này, chúng tôi sẽ trình bày cách xử lý chuỗi trong tài liệu xsl bởi vì set default mặc định, tài liệu xsl chỉ xử lý trên cây DOM
  • Bài toán được đặt ra ở đây là chúng ta cần xử lý chuỗi để apply style sheet. Tuy nhiên, xsl chỉ xử lý trên tài liệu XML đã được chuyển đổi thành cây DOM, hay nói cách cách khác xpath được áp dụng trong xsl chỉ được áp dụng trên node mà thôi
  • Do vậy, chúng ta sẽ thực hiện chuyển đổi chuỗi thành các node xml để xử lý thông qua việc cắt chuỗi và hình thành các node. Bằng cách nào chúng ta làm được điều đó. Chúng ta sẽ áp dụng khái niệm biến trong xsl và sử dụng template như là một method để gọi xử lý nhiều lần trên chuỗi để tạo thành các thẻ trong xml và convert toàn bộ biến chứa các thẻ này thành node và apply style sheet như thông thường
  • Tài liệu xsl được truyền vào chuỗi để xử lý thông qua tham số như sau

      • Chúng ta nhìn thấy trong xsl, chúng ta khai báo biến tokens
      • Biến này được gán với template tokenize, có thể hiểu theo nghĩa gọi hàm tokenize với 02 tham số truyền là string xử lý và các ký tự phân cách delim
      • Trong template tokenize, chúng ta đã thực hiện cắt chuỗi đưa vào thẻ token và gọi đệ qui template tokenize để xử lý cho đến khi nào không còn ký tự delim nào nữa
      • Biến tokens sau khi xử lý xong là một tập các tag token, chúng ta sẽ sử dụng hàm node-set để convert chúng trở thành các node trong cây DOM được xử lý trong xsl
      • Sau đó, dùng cơ chế của xsl để xuất ra xml dựa trên tập node vừa convert
    • Code java đưa truyền tham số vào trong style sheet xử lý

    • Tài liệu xml được đưa vào để test

    • Test thử code, chúng ta sẽ có được kết quả như sau

Áp dụng tài liệu xsl với tài liệu xml có namespace

  • Trong thực tế, trong quá trình xử lý code sử dụng các API cũng như cách giao tiếp thông qua tài liệu XML thì tất cả XML đều phải có namespace để tránh chuyện trùng lắp dữ liệu trong quá trình trao đổi và chia sẻ
  • Do vậy, mặc định xsl trong quá trình xử lý đang sử dụng bộ parser để chuyển đổi tài liệu xml thành cây DOM cũng không quan tâm đến namespace để tốc độ xử lý của bộ parse sẽ cực kỳ nhanh
  • Như khi áp dụng tài liệu xsl thì bộ engine apply lại ứng dụng qualified name để apply khi tài liệu XML có namespace, dẫn đến kết quả apply không thể thực hiện được
  • Ví dụ
    • Tài liệu xml cần xử lý

    • Tài liệu XSL được dùng để apply

    • Kết quả khi chúng ta apply

  • Cách giải quyết vấn đề này
    • Cách thứ nhất, chúng ta sẽ sử dụng Xpath Function là local-name() để lấy được tên node trong câu Xpath như chúng ta đã thấy trong bài Sử dụng XML trên JSP để trình bày dữ liệu (Link tham khảo http://www.kieutrongkhanh.net/2016/11/su-dung-xml-tren-jsp-e-trinh-bay-va-xu.html ). Tuy nhiên, với cách này chúng ta phải sửa toàn bộ Xpath trong các template xử lý và code trong xsl → tốn nhiều thời gian
    • Cách thứ 2, như chúng ta đã biết để sử dụng tài liệu XML nhúng vào nhau chúng ta có thể import namepace thông qua việc khai báo  namespace và dùng prefix để gọi trong xml để tránh trùng lắp. Ở đây, XSL cũng là tài liệu XML, cho nên chúng ta sẽ khai báo namespace của tài liệu xml với prefix cụ thể và modified xpath. Tuy nhiên, để không tốn thời gian modify quá nhiều chúng ta nên dùng define namespace
    • Chúng tôi sẽ ví dụ cho cách thứ 2 vì cách thứ 1 chúng đã thấy qua bài tham khảo. Trong bài ví dụ demo này chúng tôi sẽ dùng prefix và không dùng default để quí vị thấy được bản chất và áp dụng cho các bài khác – khi đó quí vị nên sử dụng default namespace
    • Tài liệu xsl được bổ sung và chỉnh sửa trong ví dụ trên như sau

    • Kết quả chúng ta sẽ nhận được như sau
      • Giao diện màn hình kết xuất

      • Kết xuất output của html khi apply

    • Có vấn đề nhỏ ở đây là output kết xuất sẽ vẫn còn giữ namespace gốc của tài liệu xml. Do vậy, nếu chúng ta muốn loại bỏ điều này ở kết xuất, chúng ta chỉ cần bổ sung thêm lệnh trong xsl để không cho phép namespace apply có trong kết xuất

Chúc mừng quí vị đã tìm hiểu thêm kiến thức về ứng dụng xsl trong thực tế xử lý ứng dụng để tạo thuận lợi trong quá trình xây dựng phần mềm

Chúng tôi hy vọng nội dung của bài này giúp ích quí vị.

Rất mong sự góp ý chân thành và chia sẻ của quí vị về vấn đề này. Hẹn gặp lại quý vị ở các chủ đề khác liên quan đến XML.

Không có nhận xét nào:

Đăng nhận xét