Phần 1 của bài giảng Chuyên đề công nghệ XML và ứng dụng cung cấp cho học viên những nội dung về: tổng quan XML; tạo tài liệu XML hợp khuôn dạng; định nghĩa kiểu tài liệu - DTD; định dạng tài liệu XML với CSS và XSL; phần tử điều khiển choose;... Mời các bạn cùng tham khảo!
TỔNG QUAN VỀ XML
Giới thiệu tổng quan về ngôn ngữ định dạng XML
XML (eXtensible Markup Language) hiện đang đóng vai trò quan trọng trong việc chuyển tải và trao đổi dữ liệu giữa các ứng dụng Sự phổ biến của XML càng được khẳng định qua việc các hệ điều hành từ Windows XP trở đi tích hợp nhiều tập tin XML Thêm vào đó, sự ra đời của bộ Net đã thúc đẩy ứng dụng XML ngày càng rộng rãi hơn trong các lĩnh vực công nghệ thông tin.
Sử dụng kỹ thuật XML không chỉ có tập đoàn Microsoft mà ngay cả Sun, IBM,
Oracles điều hỗ trợ XML sử dụng nó trong các hệ điều hành và các ứng dụng
XML là ngôn ngữ xây dựng cấu trúc tài liệu văn bản, dựa theo chuẩn SGML
The Standard Generalized Markup Language (SGML) is a powerful meta-language designed for structuring and managing the content of electronic documents Developed and standardized by the International Organization for Standards (ISO) in 1986, SGML enables the creation of various languages tailored for specific documentation needs.
SGML do IBM phát triển, nhưng không thể không nhắc đến những đóng góp quan trọng của các công ty khác XML, được phát triển bởi W3C (Tổ chức Tiêu chuẩn Web Thế giới), đã đóng vai trò quan trọng trong việc định hình các tiêu chuẩn cho trình duyệt web, máy chủ và ngôn ngữ.
XML lại do Netscape, Microsoft và các thành viên của dự án Text Encoding Initiative
(TEI) xây dựng Tổ chức W3C XML Special Interest Group có đại diện từ hơn 100 công ty cùng nhiều chuyên gia được mời khác
XML ra đời nhằm khắc phục những hạn chế của SGML phức tạp và HTML giới hạn Được thiết kế bởi tổ chức W3C vào năm 1996, phiên bản XML 1.0 được công nhận trong hồ sơ khuyến nghị của W3C vào tháng 2 năm 1998 XML là một tiêu chuẩn toàn cầu, thể hiện trí tuệ tập thể của cộng đồng, được công nhận và sử dụng rộng rãi.
XML là một định dạng đơn giản, nhưng các công cụ tiêu chuẩn như Document Object Model (DOM), XPath và XSL lại rất mạnh mẽ và hiệu quả Những công cụ này không ngừng được phát triển để nâng cao khả năng làm việc với XML.
XML là một ngôn ngữ đánh dấu tương tự như HTML, nhưng được phát triển để khắc phục một số hạn chế mà HTML gặp phải.
HTML và XML đều sử dụng thẻ, nhưng HTML có một bộ thẻ cố định với hơn 400 thẻ được định nghĩa sẵn, yêu cầu lập trình viên phải tuân thủ Điều này có thể dễ dàng đối với những người lập trình web chuyên nghiệp, nhưng lại khó khăn cho người không chuyên Hơn nữa, các thẻ HTML không cung cấp mô tả rõ ràng về dữ liệu bên trong, trong khi XML cho phép người dùng tự định nghĩa thẻ, mang lại tính linh hoạt và khả năng mô tả dữ liệu tốt hơn.
XML là do người lập trình tự định nghĩa và mỗi thẻ là một mô tả dữ liệu mà người lập trình muốn truyền đạt.
Ngôn ngữ định dạng
Ngôn ngữ định dạng (Markup Language) là công cụ mô tả nội dung của tài liệu và cách thức diễn dịch nội dung đó Trước đây, HTML là ngôn ngữ định dạng phổ biến mà chúng ta thường sử dụng.
Ví dụ: Tạo tập tin document.html
Hello HTML
Well come to the wild and woolly word of HTML
Kết quả của tập tin document.html hiển thị trên trình duyệt:
HTML và XML có mối liên hệ chặt chẽ, vì cả hai đều dựa trên chuẩn SGML Vậy XML sẽ được sử dụng và hiển thị trên trình duyệt ra sao?
Sau đây chúng ta sẽ chuyển nội dung tập tin document.html sang thành tập tin document.xml như sau:
Well come to the wild and woolly word of HTML
Kết quả hiển thị trên trình duyệt của tập tin document.xml
Kết quả hiển thị giữa tập tin document.xml và tập tin gốc hoàn toàn khác nhau, vì trình duyệt không nhận diện được các thẻ tự định nghĩa Để trình duyệt hiểu và hiển thị đúng các thẻ này, cần sử dụng bảng định kiểu (Style Sheet).
Có 2 cách chỉ ra bảng định kiểu khi định dạng:
- Dùng CSS (Cascade Style Sheet)
- Dùng XSL (Extensible Style Language)
Ví dụ: Ta dùng bảng định kiểu CSS để hiển thị nội dung tập tin document.xml trên
Bước 1:Ta thêm đoạn code (in đậm) vào tập tin document.xml trên như sau:
Well come to the wild and woolly word of HTML
Bước 2:Tạo tiếp tập tin document.css:
{ display:block; font-size:18pt; color:#FF0000; text-align:center;
MASSAGE {display:block; font-size:18pt; color:#000000;}
Bây giờ, kết quả khi chạy tập tin document.xml trên trình duyệt sẽ có hình dạng sau và không còn hiển thị nội dung tập tin gốc nữa.
Tài liệu XML hợp khuôn dạng
Tài liệu XML được coi là hợp khuôn dạng khi tuân thủ cú pháp do tổ chức W3C thiết lập Các quy tắc này được trình bày rõ trong đặc tả của XML.
XML 1.0 (những quy định các luật về thẻ, phần tử, thuộc tính, giá trị,…) Nói cách khác, tài liệu XML hợp khuôn dạng phải là tài liệu XML có cấu trúc đúng Để hợp khuôn dạng, tài liệu XML phải tuân theo các luật sau:
- Có một phần tử gốc duy nhất, chứa tất cả phần tử khác
- Mỗi thẻ mở phải có một thẻ đóng giống như nó
Ví dụ: Thẻ sai ;
- Mỗi phần tử con nằm trọn trong phần tử cha của nó
- Giá trị thuộc tính trong XML phải được đặt giữa một cặp ngoặc kép hay một cặp ngoặc đơn
- Các khai báo phải được đặt tại dòng đầu tiên của tài liệu
- Chỉ có một thành phần gốc (root)
Ví dụ: Tài liệu hợp khuôn dạng
Well come to the wild and woolly word of HTML
Tài liệu XML hợp lệ
Tài liệu XML được xem là hợp lệ khi nó được liên kết với định nghĩa kiểu dữ liệu (DTD - Document Type Definition) và tuân thủ các tiêu chuẩn đã được quy định.
Hầu hết các trình duyệt đều thực hiện kiểm tra tính hợp khuôn dạng trước, và sau đó một số trình duyệt sẽ kiểm tra thêm tính hợp lệ của tài liệu XML.
Các định nghĩa DTD xác định cú pháp chính xác cho tài liệu DTD có thể được lưu trữ trong một tệp riêng biệt hoặc tích hợp trực tiếp vào tài liệu, sử dụng phần tử hoặc thẻ < !DOCTYPE>.
Well come to the wild and woolly word of HTML
Như vậy, DTD chỉ định rằng chúng ta có hai thẻ và
Thẻ được bao quanh bởi thẻ , trong đó là phần tử gốc Các thẻ và được định nghĩa là những phần tử có khả năng chứa dữ liệu văn bản.
Bộ phân tích XML
XML for Java (XML4J) là gói phần mềm được phát triển bởi IBM, được sử dụng để phân tích tài liệu XML như một phần kèm theo của ứng dụng.
AlphaWorks - Đây là thư viện nổi tiếng và được dùng rộng rãi trong hầu hết các ví dụ của W3C
Microsoft XML Parser là một trình phân tích được tích hợp sẵn trong trình duyệt Internet Explorer từ phiên bản 5.0 trở lên, thông qua kiến trúc COM của hệ điều hành Windows Người dùng cũng có thể sử dụng trình phân tích này trong Java Standard.
Extenstion for XML – Đây là gói thư viện dành cho Java được xây dựng bởi SUN Gói này dùng chung với các ứng dụng của Java
Trình phân tích XML Python là một công cụ mạnh mẽ dành cho việc xử lý tài liệu XML trên hệ điều hành Linux và Unix Gói này được thiết kế để hoạt động hiệu quả cùng với các ứng dụng Java, mang lại khả năng tương tác linh hoạt giữa hai ngôn ngữ lập trình.
Các trình phân tích XML thường chia nhỏ dữ liệu thành các mẫu dễ truy xuất cho mã lệnh chương trình Nhiều trình phân tích còn tích hợp chức năng kiểm tra khuôn dạng và tính hợp lệ của tài liệu XML.
Bộ kiểm tra XML
Làm thế nào biết được tài liệu XML của chúng ta đúng khuôn dạng và hợp lệ?
Một trong những phương pháp hiệu quả để kiểm tra tính hợp lệ của XML là sử dụng bộ kiểm tra XML (XML Validator) Các bộ kiểm tra này là những phần mềm chuyên dụng giúp xác minh xem tài liệu XML có tuân thủ các chuẩn mực cần thiết hay không.
XML đồng thời đưa ra lời nhận xét
Kiểm tra nội dung tập tin greeting.xml bằng DOMWriter
Well come to the wild and woolly word of HTML
Kiểm tra tài liệu XML bằng Java với DOMWriter cho phép hiển thị nội dung của tệp XML nếu nó hợp lệ Trong trường hợp phát hiện lỗi, DOMWriter sẽ chỉ ra vị trí cụ thể của thẻ gây ra lỗi.
Vì vậy, tập tin greeting.xml của chúng ta sẽ gặp lỗi không hợp lệ do các thẻ
DTD chưa được định nghĩa và nhận các dòng thông báo sau:
>java dom.DOMWriter greeting.xml greeting.xml
Element type “DOCUMENT” must be declared [Error] greeting.xml : 3:35:
Element type “GREETING” must be declared Error] greeting.xml : 6:14:
Element type “MESSAGE” must be declared
Well come to the wild and woolly word of HTML
Các bộ kiểm tra Validator được chia thành hai loại chính: loại ứng dụng cài đặt giống như một chương trình thông thường và loại kiểm tra trực tiếp trên Web.
XML Writer: Đây là chương trình soạn thảo và kiểm tra tính hợp lệ của tài liệu XML.
Trình soạn thảo XML
Chúng ta có thể dùng các trình soạn thảo đơn giản để tạo tập tin XML như:
- Notepad hay Wordpad của Windows
- Vi hay Emacs của Linux hay Unix
- Mặc định của XML là dùng Unicode
Ngoài ra chúng ta có thể dùng trình soạn thảo chuyên nghiệp hơn để tạo tập tin
- XML Writer, có thể kiểm tra tính hợp khuôn dạng, tính hợp lệ
- XML Spy hay eNotepad, tương tự như XML Writer
Một số ứng dụng của XML
XML có thể tạo ra các tập ngôn ngữ con khác (ngôn ngữ định dạng dựa trên
XML, hay ngôn ngữ dựa trên XML, là một công cụ quan trọng giúp xác định các thẻ và tập con XML hoạt động trong các lĩnh vực cụ thể Ứng dụng của XML cho phép tổ chức và quản lý dữ liệu một cách hiệu quả, mang lại ý nghĩa rõ ràng cho thông tin trong từng lĩnh vực.
MathML (Ngôn ngữ Đánh dấu Toán học) là một ứng dụng của XML trong lĩnh vực toán học, cho phép định dạng các biểu thức và ký hiệu toán học một cách chính xác.
- CML (Chemical Markup Language)– ngôn ngữ định dạng hóa học; CML có thể mô tả và hiển thị nội dung của cấu trúc một phân tử hóa học
CDF (Channel Definition Format) là một định dạng dùng để xác định các kênh phân phối nội dung trên Web Các kênh này sẽ chủ động cung cấp thông tin và nội dung đến tay người dùng, giúp nâng cao trải nghiệm và tiếp cận thông tin một cách hiệu quả hơn.
- SMIL (Synchronized Multimedia Intergration Language) – ngôn ngữ tích hợp multimedia đồng bộ; là giải pháp khắc phục vấn đề xử lý các tập tin multimedia trong trình duyệt
- XHTML (Extension Hyper Text Markup Language) – mở rộng và định nghĩa lại ngôn ngữ HTML một cách có trật tự và cấu trúc hơn
- VML (Vector Markup Language) – ngôn ngữ định dạng vector
- WML (Wireless Markup Language) – ngôn ngữ định dạng mạng không dây…
Trong chương này, chúng ta sẽ tìm hiểu về cú pháp cơ bản và cách định nghĩa các thành phần XML, những khái niệm này là nền tảng cho việc nghiên cứu các nội dung khác Hợp khuôn dạng là yêu cầu tối thiểu mà tài liệu XML phải tuân thủ, bên cạnh đó, tính hợp lệ cũng là điều kiện quan trọng khi định nghĩa kiểu tư liệu DTD cho các phần tử trong tài liệu Nội dung này sẽ được khám phá chi tiết trong các chương tiếp theo.
1 Ngôn ngữ định dạng là gì ?
2 Hãy cho biết thế nào là tài liệu XML hợp lệ hay hợp khuôn dạng?
3 Làm thế nào để kiểm tra tính hợp lệ của XML?
4 Hãy cho biết những ứng dụng cơ bản của XML?
Chương 2 TẠO TÀI LIỆU XML HỢP KHUÔN DẠNG
Mục tiêu học tập: Sau khi học xong chương này người học sẽ:
- Hiểu được cú pháp của XML; Các phần tử XML; Các thuộc tính của XML
- Biết được thế nào là tài liệu XML hợp lệ, tài liệu XML hợp khuôn dạng
- Vận dụng các kiến thức trên để tạo tài liệu XML hợp khuôn dạng
Khi xây dựng tài liệu XML, việc nắm rõ các quy tắc và cú pháp định nghĩa các thành phần là rất quan trọng Tài liệu XML chỉ được coi là hợp lệ khi tuân thủ quy tắc hợp khuôn dạng (well-formed), và các trình diễn dịch XML thường yêu cầu kiểm tra lỗi cú pháp một cách nghiêm ngặt Chương này sẽ tập trung vào tính chất hợp khuôn dạng của tài liệu và cung cấp cái nhìn tổng quan về toàn bộ cú pháp XML, đây là bước khởi đầu quan trọng nhất trong việc tìm hiểu ngôn ngữ XML.
2.1 Xây dựng tài liệu hợp khuôn dạng Ở chương trước, chúng ta đã biết được thế nào là tài liệu hợp khuôn dạng, hợp lệ Vì vậy, khi tạo tài liệu XML chúng ta cần tuân theo cách đặt thẻ theo một trật tự để trình duyệt có thể phân tích được bởi các bộ phận phân tích (parser)
Các phần tử trong tài liệu XML được gọi là thực thể (entities), có thể là văn bản hoặc dữ liệu nhị phân nhưng không thể đồng thời Thực thể là đơn vị lưu trữ dữ liệu trong XML, và để được xem là tài liệu XML, các thẻ trong thực thể cần phải được sắp xếp theo một trật tự nhất định và tuân thủ khuôn dạng.
Ví dụ tạo một tài liệu order.xml hợp khuôn dạng:
- Đầu tiên ta cần chỉ định dấu hiệu nhận dạng thông tin về nội dung tài liệu
Nếu tài liệu này chứa toàn bộ thực thể duy nhất mà không tham chiếu đến các thực thể khác, chúng ta có thể hướng dẫn bộ phân tích nhận biết rằng dữ liệu XML là không phụ thuộc bằng cách sử dụng chỉ thị bổ sung.
Kế tiếp chúng ta cần phải có một phần tử hay thẻ gốc (root) cho tài liệu Ở đây chúng ta gọi thẻ này là
Phần tử gốc trong tài liệu XML có thể chứa các thẻ hay các phần tử khác
Đối với mỗi chúng ta có thể thêm các thông tin như và
Để tạo một tài liệu XML, cần tuân thủ cú pháp gồm việc tạo chỉ thị xử lý XML, xây dựng phần tử gốc và tạo các phần tử con lồng trong phần tử gốc Các phần tử bên trong thẻ gốc có thể chứa nhiều thẻ con lồng sâu vào nhau.
2.2 Định dạng và dữ liệu kiểu ký tự Định dạng tài liệu giúp chúng ta tạo nên một cấu trúc Định dạng bao gồm thẻ bắt đầu, thẻ kết thúc, các phần tử thẻ rỗng, các tham chiếu thực thể, tham chiếu ký tự, lời chú thích, phân đoạn CDATA Tất cả các dữ liệu còn lại trong tài liệu XML không phải là định dạng đều được xem là dữ liệu ký tự (text)
2.3 Phần khởi đầu của tài liệu XML
Phần mở đầu của tài liệu XML bao gồm các khai báo phiên bản XML, lời chú thích, chỉ thị xử lý, khoảng trắng và khai báo kiểu dữ liệu DTD.
2.4 Các khai báo và câu chú thích trong tài liệu XML
Một tài liệu XML cần bắt đầu bằng một khai báo để chỉ rõ rằng nó tuân theo định dạng và đặc tả XML, và khai báo này phải nằm ở dòng đầu tiên của tài liệu Khai báo XML được thể hiện dưới dạng chỉ thị xử lý, nằm trong cặp thẻ Trong phần tử khai báo, có thể sử dụng ba kiểu khai báo thuộc tính khác nhau.
- Khai báo phiên bản (version): Khai báo này cho biết phiên bản đặc tả XML mà tài liệu đang sử dụng
Khai báo mã hóa trong tài liệu XML xác định bộ mã mà tài liệu sử dụng, với mặc định là UTF-8 Ngoài ra, có thể sử dụng các loại mã khác như Unicode, UCS-2 hoặc UCS-4 Thuộc tính này là tùy chọn và có vai trò quan trọng trong việc đảm bảo tính tương thích và chính xác của dữ liệu.
Khi khai báo thực thể độc lập (standalone) trong tài liệu XML, hãy đặt thuộc tính này là “yes” nếu tài liệu không tham chiếu đến các thực thể bên ngoài; nếu không, thuộc tính này mặc định là “no” Thuộc tính này là tùy chọn Để tăng tính dễ hiểu và dễ chỉnh sửa cho tập tin XML, việc sử dụng các dòng chú thích là rất quan trọng, và các chú thích này cần được đặt trong cặp thẻ Lưu ý rằng chú thích không nên được đặt trước các khai báo.
Không gian tên XML (NameSpace) cho phép định nghĩa linh hoạt các thẻ, giúp sử dụng cùng một tên cho nhiều loại dữ liệu khác nhau trong một tài liệu XML.
Robert Louis Stevenson
TẠO TÀI LIỆU XML HỢP KHUÔN DẠNG
Xây dựng tài liệu hợp khuôn dạng
Trong chương trước, chúng ta đã tìm hiểu về tài liệu hợp khuôn dạng và hợp lệ Do đó, khi tạo tài liệu XML, cần tuân thủ trật tự đặt thẻ để trình duyệt có thể phân tích đúng cách thông qua các bộ phận phân tích (parser).
Các phần tử trong tài liệu XML được gọi là thực thể (entities), có thể là văn bản hoặc dữ liệu nhị phân, nhưng không thể là cả hai Thực thể là đơn vị lưu trữ dữ liệu trong XML, và để được coi là tài liệu XML, các thẻ trong thực thể cần được sắp xếp theo một trật tự nhất định và tuân thủ khuôn dạng quy định.
Ví dụ tạo một tài liệu order.xml hợp khuôn dạng:
- Đầu tiên ta cần chỉ định dấu hiệu nhận dạng thông tin về nội dung tài liệu
Nếu tài liệu này chỉ chứa một thực thể duy nhất mà không tham chiếu đến các thực thể khác, chúng ta có thể hướng dẫn bộ phân tích nhận biết rằng dữ liệu XML này là không phụ thuộc bằng cách sử dụng chỉ thị bổ sung.
Kế tiếp chúng ta cần phải có một phần tử hay thẻ gốc (root) cho tài liệu Ở đây chúng ta gọi thẻ này là
Phần tử gốc trong tài liệu XML có thể chứa các thẻ hay các phần tử khác
Đối với mỗi chúng ta có thể thêm các thông tin như và
Để tạo một tài liệu XML, chúng ta cần tuân theo cú pháp bao gồm: chỉ thị xử lý XML, phần tử gốc và các phần tử con lồng trong phần tử gốc Các phần tử bên trong có thể chứa thêm nhiều thẻ con lồng sâu vào nhau.
Định dạng và dữ liệu kiểu ký tự
Định dạng tài liệu là yếu tố quan trọng trong việc tạo cấu trúc cho tài liệu XML, bao gồm các thẻ bắt đầu, thẻ kết thúc, phần tử thẻ rỗng, tham chiếu thực thể, tham chiếu ký tự, lời chú thích và phân đoạn CDATA Tất cả dữ liệu không thuộc định dạng trong tài liệu XML được xem là dữ liệu ký tự (text).
Phần khởi đầu của tài liệu XML
Phần mở đầu của tài liệu XML bao gồm các khai báo phiên bản XML, lời chú thích, chỉ thị xử lý, khoảng trắng và khai báo kiểu tư liệu DTD.
Các khai báo và câu chú thích trong tài liệu XML
Một tài liệu XML cần bắt đầu bằng một khai báo để xác định định dạng và đặc tả XML Khai báo này phải được đặt ở dòng đầu tiên và được thể hiện dưới dạng chỉ thị xử lý trong cặp thẻ Trong phần tử khai báo, có thể sử dụng ba kiểu khai báo thuộc tính khác nhau.
- Khai báo phiên bản (version): Khai báo này cho biết phiên bản đặc tả XML mà tài liệu đang sử dụng
Khai báo mã hóa trong tài liệu XML xác định bộ mã được sử dụng, với mặc định là UTF-8 Ngoài ra, có thể sử dụng các mã như Unicode, UCS-2 hoặc UCS-4 Thuộc tính này là tùy chọn và giúp đảm bảo tính tương thích cho các ký tự trong tài liệu.
Khi khai báo thực thể độc lập trong tài liệu XML, bạn nên đặt thuộc tính này là “yes” nếu tài liệu không tham chiếu đến các thực thể bên ngoài; nếu không, thuộc tính mặc định là “no” Thuộc tính này là tùy chọn, nhưng để cải thiện khả năng hiểu và chỉnh sửa tài liệu sau này, các dòng chú thích là rất cần thiết Chú thích được đặt trong cặp thẻ , và lưu ý rằng chúng không được đặt trước các khai báo.
Không gian tên
Không gian tên XML (NameSpace) cho phép định nghĩa linh hoạt các thẻ, giúp sử dụng cùng một tên cho nhiều loại dữ liệu khác nhau trong một tài liệu XML.
Robert Louis Stevenson
Trong ví dụ trên, phần tử đề cập đến hai loại dữ liệu khác nhau: tên tác giả và tiêu đề sách, điều này có thể gây nhầm lẫn Nếu tài liệu chỉ sử dụng cho một mục đích riêng thì không vấn đề gì, nhưng khi kết hợp với tài liệu khác, chúng ta không thể đảm bảo rằng tài liệu đó không sử dụng thẻ trùng với thẻ đã định nghĩa trong tài liệu của mình.
Ví dụ khi chúng ta tích hợp tài liệu XML của chúng ta với ứng dụng khác như
Khi VML và MathML có cùng định nghĩa cho thẻ NAME trong các tài liệu, trình phân tích sẽ gặp khó khăn trong việc xác định thẻ NAME nào nên được hiểu, dẫn đến sự nhầm lẫn giữa tài liệu của chúng ta và các tài liệu VML hoặc MathML.
Vì vậy, chúng ta cần phải khai báo không gian tên để khắc phục điều này.
Thẻ và các phần tử
Cấu trúc tài liệu XML được xây dựng dựa trên các thành phần định dạng, chủ yếu là các phần tử (element) Mỗi phần tử thường bao gồm một cặp thẻ, bao gồm thẻ bắt đầu và thẻ kết thúc, ngoại trừ các phần tử rỗng, được định nghĩa bằng một thẻ duy nhất.
- Thẻ mở: bắt đầu bằng ký tự “” Ví dụ:
- Thẻ đóng: bắt đầu bằng ký tự “” Ví dụ:
Tên thẻ phải bắt đầu bằng ký tự, dấu gạch dưới (_) hoặc dấu hai chấm (:) Các ký tự tiếp theo có thể bao gồm ký tự, chữ số, dấu gạch, gạch nối, dấu chấm và dấu hai chấm, nhưng không được phép có khoảng trắng.
- Bộ phân tích và diễn dịch XML phân biệt chữ hoa chữ thường
- Mặc dù XML cho phép dùng dấu hai chấm trong tên thẻ nhưng nên tránh dùng
Một phần tử trong HTML thường bao gồm một thẻ mở và một thẻ đóng, với dữ liệu hoặc các cặp thẻ khác nằm giữa hai thẻ này Tuy nhiên, cũng có những phần tử chỉ chứa một thẻ duy nhất, được gọi là thẻ rỗng Các thẻ rỗng này có dấu đóng là “/>” thay vì “>”, cho phép chúng đứng một mình mà không cần thẻ đóng.
Phần tử gốc
Tài liệu XML được gọi là hợp khuôn dạng khi chỉ chứa một phần tử gốc duy nhất, phần tử này đóng vai trò quan trọng trong cấu trúc của tài liệu Để phân tích nội dung XML, cần bắt đầu từ phần tử gốc và lần lượt truy xuất các phần tử khác Người dùng có thể tự do đặt tên cho phần tử gốc.
Phần tử ở trên là phần tử gốc.
Thuộc tính
Thuộc tính (Attribute) được biểu diễn dưới dạng cặp name=value, cho phép cung cấp thêm thông tin và ý nghĩa cho thẻ Các thuộc tính này được đặt bên trong thẻ mở và thẻ rỗng, với giá trị thường được gán bằng dấu (=).
Bộ xử lý và phân tích XML sẽ truy xuất giá trị của các thuộc tính, cho phép chúng ta sử dụng những giá trị này trong ứng dụng của mình.
Tên của thuộc tính cần tuân thủ theo quy tắc đặt tên thẻ
2.8.2 Trị gán cho thuộc tính
Vì định dạng của thuộc tính luôn là văn bản, giá trị của nó cũng được biểu diễn dưới dạng text, ngay cả khi gán trị số Do đó, để thực hiện các phép toán với chuỗi số, chúng ta cần sử dụng các hàm chuyên dụng trong ngôn ngữ lập trình để chuyển đổi chuỗi thành số.
Giá trị thuộc tính trong cặp dấu nháy kép (“”) có thể sử dụng dấu nháy đơn („ ‟) khi chuỗi cần truyền chứa dấu nháy kép Nếu chuỗi cần truyền bao gồm cả dấu nháy kép và dấu nháy đơn, ta có thể sử dụng thực thể định nghĩa của XML là &apos cho dấu nháy đơn và " cho dấu nháy kép.
Thuộc tính này được các công cụ tìm kiếm sử dụng để xác định ngôn ngữ của dữ liệu, với giá trị được gán theo mã quốc gia ISO 639, bao gồm hai ký tự viết tắt.
Một số quy tắc xây dựng cấu trúc tài liệu hợp khuôn dạng
- Các khai báo XML cần được đặt ở dòng đầu tiên của tài liệu
- Tài liệu XML chỉ có một phần tử gốc, các phần tử khác nếu có phải là con của phần tử gốc
- Mọi phần tử XML khác rỗng phải bao gồm đầy đủ thẻ mở và thẻ đóng
- Đóng phần tử rỗng với chuỗi đóng là “/>”
- Mọi phần tử khác phần tử gốc đều phải nằm giữa cặp thẻ gốc
- Các phần tử lồng nhau phải có thẻ đóng và thẻ mở hợp vị trí
- Tên thuộc tính phải là duy nhất
- Chỉ sử dụng 5 tham chiếu thực thể được định nghĩa trước trong XML như:
- Bọc giá trị thuộc tính bằng cặp dấu nháy (“ ”)
- Chỉ nên sử dụng ký tự “
Khi dữ liệu nằm trong CDATA được xử lý bởi trình phân tích, nó sẽ được giữ nguyên như ban đầu, tức là trình phân tích sẽ bỏ qua các đoạn CDATA Điều này rất quan trọng khi chúng ta cần viết mã script trong tài liệu.
{ alert(“This is CDATA! ”);
Không gian tên của XML
Khi tài liệu XML chỉ phục vụ cho một mục đích cụ thể và không cần kết hợp với các tài liệu khác, vấn đề không đáng lo ngại Tuy nhiên, khi ứng dụng mở rộng và tài liệu XML cần tương tác với các tài liệu khác, việc phân biệt phạm vi và không gian tên cho các thẻ là rất quan trọng Điều này giúp tránh sự nhầm lẫn cho trình phân tích và đảm bảo tính chính xác trong việc xử lý dữ liệu.
2.11.1 Tạo không gian tên Để định nghĩa một không gian tên cho các thẻ, chúng ta đưa thuộc tính xmlns:prefix vào phần tử gốc – prefix là tên miền hay không gian tên mà ta muốn chỉ định Mỗi không gian tên cần mang một định danh URIs duy nhất
Ví dụ: xmlns:minhkhai= “http://www.minhkhai.com.vn/spec”
2.11.2 Không gian tên cục bộ
Chúng ta không chỉ có thể đặt thuộc tính xmlns ở phần tử gốc, thuộc tính này còn có thể đặt ở bất kỳ thẻ nào
Trong chương này, chúng ta đã tìm hiểu về cú pháp cơ bản và cách định nghĩa các thành phần XML, tạo nền tảng vững chắc cho việc nghiên cứu các chương tiếp theo.
Hợp khuôn dạng là yêu cầu cơ bản đầu tiên mà tài liệu XML phải tuân thủ Ngoài ra, để đảm bảo tính hợp lệ, tài liệu XML cần định nghĩa DTD cho các phần của nó Chủ đề này sẽ được nghiên cứu chi tiết trong chương tiếp theo.
1 Hãy nêu một số quy tắc xây dựng cấu trúc tài liệu hợp khuôn dạng?
2 Phân đoạn CDATA là gì?
3 Hãy áp dụng các quy tắc trên để tạo một tài liệu hợp khuôn dạng.
ĐỊNH NGHĨA KIỂU TÀI LIỆU – DTD
Định nghĩa kiểu tài liệu
DTD (Document Type Definition) là một công cụ quan trọng để xác định kiểu dữ liệu cho các phần tử trong tài liệu XML Việc định nghĩa các phần tử trong DTD giúp đảm bảo rằng tài liệu XML tuân thủ cấu trúc và quy tắc đã được thiết lập, từ đó cải thiện tính nhất quán và khả năng tương tác của dữ liệu.
XML có tính linh hoạt cao, miễn là tuân thủ các quy tắc của tài liệu XML Tuy nhiên, để tăng tính rõ ràng, việc định nghĩa kiểu dữ liệu cho từng phần tử trong tài liệu XML là rất cần thiết.
Trong chương trước, chúng ta đã tìm hiểu về cách viết tài liệu hợp khuôn dạng Tuy nhiên, để một tài liệu XML được coi là hợp khuôn và có giá trị, tất cả các phần tử trong tài liệu cần phải được định nghĩa kiểu dữ liệu mà chúng chứa.
Khi đọc một tài liệu XML, việc hiểu rõ cấu trúc của nó trở nên dễ dàng hơn thông qua cách định nghĩa kiểu tài liệu (DTD) DTD cung cấp thông tin cần thiết để nhận diện cấu trúc và các thành phần bên trong tài liệu XML.
Trước khi đi vào phần chi tiết về cách tạo một tài liệu DTD, chúng ta hãy xem ví dụ sau:
Don't forget me this weekend
Trong ví dụ trên, phần in nhạt thể hiện DTD, dùng để mô tả kiểu dữ liệu của tài liệu XML, trong khi phần in đậm đại diện cho các phần tử của tài liệu XML.
Trong ví dụ này, phần DTD mô tả tài liệu XML với phần tử gốc là "note", bao gồm bốn phần tử con: "to", "from", "heading" và "body", tất cả đều có kiểu dữ liệu là văn bản.
Định nghĩa một tài liệu DTD
Để viết một tài liệu DTD chúng ta chỉ cần tuân thủ đúng một số quy tắc của
W3C là được Đầu tiên chúng ta hãy tìm hiểu về các phần tử (element), thuộc tính và thực thể của DTD
Phần tử này được sử dụng để khai báo bắt đầu định nghĩa kiểu tài liệu DTD, có hai dạng là DTD tham chiếu nội và DTD tham chiếu ngoại DTD tham chiếu nội được định nghĩa ngay trong tài liệu XML, trong khi DTD tham chiếu ngoại được định nghĩa bên ngoài tài liệu XML Hãy cùng tìm hiểu từng cú pháp cụ thể.
3.2.1.1 Định nghĩa DTD tham chiếu nội Để bắt đầu định nghĩa kiểu tài liệu DTD tham chiếu nội (Internal Reference)chúng ta dùng cú pháp sau:
Trong đó root-element là phần tử gốc của tài liệu XML, DTD là các định nghĩa cho các phần tử trong tài liệu XML
Don't forget me this weekend
3.2.1.2 Định nghĩa DTD tham chiếu ngoại
Sử dụng định nghĩa DTD tham chiếu ngoại giúp các ứng dụng XML dễ dàng chia sẻ và tương tác với các ứng dụng khác.
Có hai cách để chỉ định một DTD tham chiếu ngoại: Tham chiếu ngoại riêng và tham chiếu ngoại chung
Các định nghĩa DTD tham chiếu ngoại riêng được áp dụng cho một nhóm người cụ thể và không phù hợp cho mục đích phân phối rộng rãi Ngược lại, các định nghĩa DTD tham chiếu ngoại chung có tính chất cộng đồng hơn Để định nghĩa một DTD tham chiếu ngoại riêng, chúng ta sử dụng cú pháp nhất định.
Trong đó root-element là tên của phần tử gốc trong tài liệu XML, tập tinname là tên tập tin định nghĩa kiểu tài liệu DTD
Don't forget me this weekend!
Tập tin note.dtd với nội dung như sau:
Địa chỉ chứa tập tin DTD có thể có một URL/URI
Don't forget me this weekend!
Để định nghĩa một DTD tham chiếu ngoại chung chúng ta dùng cú pháp sau:
Trong đó FPI (Formal Public Identifier) là một định danh chung hình thức, chúng ta cần tuân theo một số quy tắc áp dụng cho FPI sau:
Trường đầu tiên của một FPI là xác định mối liên hệ giữa DTD và chuẩn hình thức Đối với các DTD tự định nghĩa, trường này được biểu thị bằng một dấu chấm, trong khi với các chuẩn hình thức, trường này sẽ tự tham chiếu đến chuẩn tương ứng của nó.
- Trường thứ hai là tên nhóm hay tên người chịu trách nhiệm bảo trì và nâng cấp các định nghĩa DTD và tên này phải mang tính duy nhất
Trường thứ ba xác định kiểu tài liệu được mô tả và thường đi kèm với một định danh duy nhất, chẳng hạn như phiên bản 1.0.
- Trường thứ ba chỉ định ngôn ngữ mà chúng ta định nghĩa DTD (ví dụ như ngôn ngữ Tiếng Anh - EN)
- Mỗi trường của FPI cách nhau bởi dấu //
Don't forget me this weekend!
Còn URL là địa chỉ của tập tin DTD
Phần tử dùng để định nghĩa kiểu dữ liệu cho một phần tử của một tài liệu XML Chúng ta sử dụng theo cú pháp sau:
- element_name: tên của phần tử mà ta muốn định nghĩa
- content_model: kiểu của phần tử này, có thể là EMPTY, ANY, #PCDATA, các phần tử con hay trộn lẫn nhiều thành phần
Bây giờ chúng ta tìm hiểu chi tiết hơn
• Định nghĩa một phần tử rỗng
• Định nghĩa một phần tử có chứa nhiều kiểu dữ liệu
• Định nghĩa một phần tử có kiểu văn bản
• Định nghĩa một phần tử có chứa một phần tử con
Một phần tử có thể chứa nhiều hơn một phần tử con, và cách đơn giản để định nghĩa điều này là liệt kê tất cả các phần tử con, mỗi phần tử được ngăn cách bởi dấu phẩy (,).
Ví dụ để khai báo phần tử note có 4 phần tử con là to, from, heading, body chúng ta viết như sau:
Chúng ta có thể tối ưu hóa cách viết bằng cách sử dụng ký tự đại diện cho những phần tử có nhiều phần tử con, thay vì viết chi tiết từng phần tử.
Dưới đây là một số nguyên tắc sử dụng ký tự đại diện:
Giả sử chúng ta có phần tử ROOT, phần tử này có hai phần tử con là LIMB_A và LIMB_B, chúng ta có một số định nghĩa sau:
Phần tử ROOT không có hoặc có nhiều phần tử LIMB_A
Phần tử ROOT có một hoặc nhiều phần tử con LIMB_A
Phần tử ROOT không có hoặc có một phần tử con LIMB_A
Phần tử ROOT có 2 phần tử con, đầu tiên là phần tử LIMB_A tiếp đến là LIMB_B
Phần tử ROOT có một phần tử con, có thể là LIMB_A hoặc LIMB_B, định nghĩa một phần tử chứa phần tử con hoặc chứa dữ liệu văn bản.
Phần tử dùng để định nghĩa kiểu tài liệu của các thuộc tính cho một phần tử trong tài liệu XML Chúng ta dùng cú pháp sau:
- element_name: tên của một phần tử cần định nghĩa thuộc tính
- attribute_name: tên thuộc tính cần định nghĩa
- attribute_type: kiểu của thuộc tính Có thể nhận một trong các giá trị sau:
CDATA Cho biết thuộc tính này chỉ có thể chứa kiểu dữ liệu ký tự
(en1|en2| ) Danh sách các giá trị mà thuộc tính có thể được gán
ID là thuộc tính yêu cầu các giá trị phải duy nhất và bắt đầu bằng một chữ cái IDREF xác định rằng giá trị của thuộc tính này phải tương ứng với một trong các giá trị ID của các phần tử khác IDREFS yêu cầu giá trị của thuộc tính phải là các giá trị thuộc kiểu ID NMTOKEN chỉ ra rằng giá trị của thuộc tính phải tuân theo quy tắc đặt tên trong tài liệu XML NMTOKENS tương tự như NMTOKEN nhưng cho phép chứa nhiều giá trị MTOKEN.
ENTITY Cho biết thuộc tính này nhận giá trị là một tên tham chiếu của thực thể
ENTITIES Cho biết thuộc tính này nhận giá trị là các tên tham chiếu của thực thể và cách nhau bởi khoảng trắng
- default_value: thông tin về giá mặc định của thuộc tính này Nó có thể nhận một trong các giá trị sau:
Value Value là một giá trị mặc định nào đó
#REQUYRED Chỉ định là không có giá trị mặc định cho thuộc tính này, nhưng khi sử dụng là phải khởi tạo
#IMPLIED Chỉ định là không có giá trị mặc định cho thuộc tính này, và thuộc tính này không cần dùng đến
#FIXED value Chỉ định thuộc tính này chỉ mang duy nhất giá trị value này
Chúng ta có thể định nghĩa một phần tử có nhiều thuộc tính theo cú pháp sau:
attribute-name_n attribute_type_n default_value_n>
Giả sử chúng ta có tập tin att.dtd với nội dung sau:
Tập tin XML chúng ta viết như sau:
Text
Giả sử chúng ta có tập tin att.dtd với nội dung sau:
Tập tin XML chúng ta viết như sau:
Nếu chúng ta viết như sau sẽ không hợp quy tắc vì kiểu NMTOKEN không chấp nhận ký tự #
Giả sử chúng ta có tập tin att.dtd với nội dung sau:
Tập tin XML chúng ta viết như sau:
Nếu chúng ta viết như sau sẽ không hợp quy tắc vì phần tử CCC có thuộc tính
X có kiểu là ID nên phải là duy nhất
Việc viết như vậy không tuân thủ quy tắc vì các phần tử AAA và CCC có thuộc tính kiểu ID, do đó không được phép có giá trị trùng lặp.
Giả sử chúng ta có tập tin att.dtd với nội dung sau:
Tập tin XML chúng ta viết như sau là hợp quy tắc:
Việc viết như vậy không tuân thủ quy tắc, vì phần tử DDD có thuộc tính ref với kiểu IDREFS, nhưng chúng ta lại gán giá trị cho thuộc tính này là ref="a1 b001 a2", trong đó b001 không phải là giá trị của một ID hợp lệ.
Giả sử chúng ta có tập tin att.dtd với nội dung sau:
Tập tin XML chúng ta viết như sau là hợp quy tắc:
Nếu chúng ta viết như sau sẽ không hợp quy tắc vì phần tử AAA và phần tử
Trong lập trình, thuộc tính BBB có giá trị true, trong khi thuộc tính month được định nghĩa dưới dạng kiểu liệt kê Tuy nhiên, chúng ta lại gán giá trị cho cả hai thuộc tính này ngoài các giá trị đã được liệt kê trước đó.
Thực thể
Thực thể (Entity) là một định nghĩa cho một biến lưu trữ khối dữ liệu, khi được triệu gọi, nó sẽ chèn toàn bộ dữ liệu vào vị trí yêu cầu Khối dữ liệu của thực thể thường ở dạng text, nhưng cũng có thể là dữ liệu nhị phân, miễn là không làm phá vỡ cấu trúc của tài liệu.
XML khi nó được gọi
Có hai loại thực thể trong DTD: thực thể tổng quát và thực thể tham số Thực thể tổng quát được khai báo trong phần định nghĩa DTD, và để tham chiếu đến nó, chúng ta sử dụng cú pháp cụ thể.
Trong đó, name_entity là tên của thực thể tổng quát cần được tham chiếu Lưu ý rằng nó phải bắt đầu bằng ký tự "&" và kết thúc bằng dấu chấm phẩy (;) Để tham chiếu đến thực thể tham số, chúng ta sử dụng cú pháp cụ thể.
Trong đó name_entity là tên thực thể tham số cần tham chiếu Lưu ý là bắt đầu bởi ký tự % và kết thúc bởi dấu chấm phẩy
Có hai loại thực thể tổng quát đó là thực thể tổng quát nội và thực thể tổng quát ngoại
* Thực thể tổng quát nội
Chúng ta định nghĩa theo cú pháp sau:
&out-text; Đối với thực thể này chúng ta cũng có thể định nghĩa các thực thể tham chiếu lồng nhau
Tuy nhiên chúng ta không thể đảo ngược lại
* Thực thể tổng quát ngoại
Thực thể tổng quát ngoại là thực thể được định nghĩa và tham chiếu từ một nguồn bên ngoài
Chúng ta định nghĩa định nghĩa theo 1 trong 2 cú pháp sau:
FPI đã được đề cập đến trong phần trên
URI/URL là địa chỉ đến nguồn dữ liệu cần gán cho entity-name
"http://www.w3schools.com/entities/entities.xml">
& writer; ©right;
Thực thể tham số khác với thực thể tổng quát ở chỗ nó có thể được tham chiếu ngay trong các khai báo DTD, và vùng hoạt động của nó chỉ giới hạn trong các khai báo này.
Mục đích của việc sử dụng thực thể tham số trong DTD là để giảm thiểu sự lặp lại trong các khai báo, đồng thời tạo điều kiện thuận lợi cho việc thay đổi và quản lý cấu trúc dữ liệu.
Tương tự như thực thể tổng quát, thực thể tham số cũng có hai loại đó là thực thể tham số ngoại và thực thể tham số nội
* Thực thể tham số nội
Thực thể tham số nội là thực thể được định nghĩa ngay trên DTD của tài liệu
XML Định nghĩa thực thể tham số chúng ta dùng cú pháp sau:
% là tham số bắt buộc entity_name là tên của thực thể tham số cần định nghĩa entity_value là giá trị cần gán cho entity_name
Ví dụ: Có sử dụng thực thể tham số nội:
Không sử dụng thực thể tham số nội
* Thực thể tham số ngoại
Thực thể tham số ngoại là thực thể được xác định và tham chiếu từ một nguồn bên ngoài Để định nghĩa thực thể tham số ngoại, chúng ta có thể sử dụng một trong hai cú pháp sau:
Từ khóa SYSTEM cho biết đây là thực thể tham số ngoại riêng
Từ khóa PUBLIC cho biết đây là thực thể tham số ngoại chung FPI là một định danh chung hình thức
URI/URL là địa chỉ của khối dữ liệu cần gán cho entity_name
Giả sử chúng ta có tập tin hocsinh.dtd như sau:
Bây giờ chúng ta viết tập tin tài liệu XML có tên test.xml với thực thể tham số ngoại như sau:
Viết có nghĩa là tập tin hocsinh.dtd nằm cùng thư mục với tập tin test.xml
Nếu tập tin hocsinh.dtd đặt tại địa chỉ http://hs.com.vn/hocsinh.dtd thì chúng ta viết lại dòng đó như sau:
“http://hs.com.vn/hocsinh.dtd”>
Chúng ta xem ví dụ sau:
Chú ý rằng DTD này định nghĩa các thực thể tham số có khả năng tham chiếu lẫn nhau theo thứ tự từ trên xuống và có thể được sử dụng ngay trong định nghĩa của một element Tuy nhiên, để các tham chiếu này hoạt động hiệu quả, chúng cần được định nghĩa độc lập trong một tập tin DTD và được tham chiếu vào tài liệu XML dưới dạng DTD tham chiếu ngoại.
Kết quả hiển thị trên trình duyệt
Dòng 1: Phần tử stylesheet dùng để khai báo namespace, báo cho trình phân tích biết đây là phiên bản XSLT
Dòng 2: Khai báo kiểu dữ liệu ra, kiểu dữ liệu ra là dưới dạng HTML
Dòng 3: Khai báo phần tử template chính và cho biết vị trí khởi đầu là phần tử gốc
Dòng 4: Các thẻ mở HTML
Dòng 4, 6, 7: Chọn nội dung của phần tử BBB thứ 1, 2, 3
Dòng 8: Các thẻ đóng HTML
Dòng 9: Thẻ đóng phần tử template chính
Dòng 10: Thẻ đóng của phần tử stylesheet
Phần tử này cho phép chúng ta thêm thuộc tính vào một phần tử trong hồ sơ kết quả, với giá trị được lấy từ tài liệu XML.
Tài liệu XSL lưu với tên test.xsl XML