Khi định nghĩa không gian tên mặc định cho một phần tử (gốc) ngƣời ta sẽ không cần phải dùng tiền tố cho tất cả các phần tử con. Các phần tử và thuộc tính không có tiền tố không gian tên nghĩa là nó có không gian tên mặc định của phần tử cha.
Ví dụ sau định nghĩa không gian tên mặc định cho phần tử gốc<html> la xmlns=http://www.w3.org/1999/xhtml, các phần tử <head>, <title> sẽ có không gian tên mặc định là xmlns=” http://www.w3.org/1999/xhtml”:
<?xml version=”1.0” encoding=”UTF-8”?> <html xmlns=” http://www.w3.org/1999/xhtml”> <head>
<title>
Su dung xHTML va MathML together </title>
</head> … </html>
2.5.12.1. Sử dụng DTD tạo tài liệu XML hợp lệ
Đã đến lúc ngƣời ta cần biết cách tạo một tài liệu XML hợp lệ. không giống nhƣ HTML, ở đó trình duyệt có thể kiểm tra HTML bởi vì nó biết tất cả về HTML hợp lệ. với XML ngƣời ta có thể tạo thẻ cho riêgn bạn, điều đó có nghĩa là trình xử lý XML không thể kiểm tra thẻ của ngƣời ta trừ khi ngƣời ta cho nó biết làm cách nào. Trong XML ngƣời ta chỉ ra cái gì là hợp lệ, cái gì là không hợp lệ bằng cách chỉ ra cú pháp sẽ cho phép đối với tài liệu. có 2 cách để thực hiện điều này là dùng DTD (Document Type Definition_định nghĩa kiểu tài liệu) và dùng lƣợc đồ XML.
DTD - Định nghĩa kiểu tài liệu: DTD cung cấp cách để kiểm tra sự hợp lệ của tài liệu. cú pháp của DTD đƣợc xây dựng trong đặc tả XML 1.0. hầu hết trình xử lý XML sử dụng DTD trong tài liệu XML và DTD là bƣớc đầu tiên trong bất kỳ thảo luận nào về kiểm tra sự hợp lệ.
Giới thiệu về DTD: Nhƣ ngƣời ta đã biết một tài liệu XML cần phải hợp khuôn dạng mới đƣợc xem đúng là tài liệu XML, điều này chỉ là một phần của yêu cầu. Chúng ta cần phải cho trình xử lý XML vài cách để kiểm tra cú pháp của tài liệu XML nhằm đảm bảo ràng dữ liệu vẫn còn hợp lệ. xem lại ví dụ trƣớc:
<?xml version=”1.0” encoding=”UTF-8” standalone=”yes”?> <document>
<employee> <name>
<firstname>Nguyen</firstname> <lastname>Son Nam</lastname> </name> <hiredate>July 15, 2005</hiredate> <projects> <project> <product>Printer</product> <id>HP2300</id> <price>$111.00</price> </project> <project> <product>Laptop</product> <id>DELL1100 </id> <price>$989.00</price> </project> </projects> </employee> … </document>
Giả sử khi số lƣợng nhân viên tăng lên đáng kể, việc nhập liệu có thể sai, nhƣng làm thế nào trình xử lý XML biết phần tử <project> phải chứa ít nhất một phần tử <product> trừ khi chúng ta cho nó biết ? làm thế nào cho trình xử lý XML biết mối phần tử <employee> phải chứa phần tử <name>? để làm những điều này chúng ta cần sử dụng DTD. DTD chỉ ra cấu trúc của tài liệu XML chứ không phải dữ liệu trong tài liệu đó.
Chúng ta định nghĩa cú pháp của tài liệu XML bằng cách dùng DTD và khai báo định nghĩa đó trong tài liệu bằng cách khai báo kiểu tài liệu. dùng phần tử <!DOCTYPE> để tạo DTD và DTD xuất hiện trong phần tử đó. phần tử này có thể có một số dạng khác nhau nhƣ sau:
<!DOCTYPE rootname [DTD]>
<!DOCTYPE rootname SYSTEM URI>
<!DOCTYPE rootname SYSTEM URI [DTD]> <!DOCTYPE rootname PUBLIC identifine URI>
<!DOCTYPE rootname PUBLIC identifine URI [DTD]> Rootname: Tên phần tử gốc.
URI: Định dạng của DTD bên ngoài tài liệu XML hiện thời trên không gian mạng Internet.
Phần tử <!DOCTYPE> là một phần của phẩn mở đầu tài liệu. Ví dụ cho thấy một định nghĩa DTD cho tài liệu quản lý nhân viên:
<?xml version=”1.0” encoding=”UTF-8” standalone=”yes”?> <!DOCTYPE document [
<!ELEMENT document (employee)*>
<!ELEMENT employee (name, hiredate, projects)> <!ELEMENT name (firstname, lastname)>
<!ELEMENT firstname (#PCDATA)> <!ELEMENT lastname (#PCDATA)> <!ELEMENT hiredate (#PCDATA)> <!ELEMENT projects (project)*>
<!ELEMENT projecta (product, id, price)> <!ELEMENT product (#PCDATA)> <!ELEMENT id (#PCDATA)> <!ELEMENT price (#PCDATA)> ]> <document> <employee> <name> <firstname>Nguyen</firstname> <lastname>Son Nam</lastname> </name> <hiredate>July 15, 2005</hiredate> <projects> <project> <product>Printer</product> <id>HP2300</id> <price>$111.00</price> </project> <project> <product>Laptop</product> <id>DELL1100 </id> <price>$989.00</price> </project> </projects> </employee> </document>
2.5.12.2. Dùng DTD kiểm tra tài liệu XML
Kiểm tra tài liệu XML, ngƣời ta cũng có thể dùng trình soạn thảo XML nhƣ XML write chẳng hạn để kiểm tra sự hợp lệ và hợp khuôn dạng của tài liệu.
Sau đó giả sử do nhập liệu sai thẻ <name> thành <nam> <?xml version=”1.0” encoding=”UTF-8” standalone=”yes”?> <!DOCTYPE document [
<!ELEMENT employee (name, hiredate, projects)> <!ELEMENT name (firstname, lastname)>
<!ELEMENT firstname (#PCDATA)> <!ELEMENT lastname (#PCDATA)> <!ELEMENT hiredate (#PCDATA)> <!ELEMENT projects (project)*>
<!ELEMENT project (product, id, price)> <!ELEMENT product (#PCDATA)> <!ELEMENT id (#PCDATA)> <!ELEMENT price (#PCDATA)> ]> <document> <employee> <nam> <firstname>Nguyen</firstname> <lastname>Son Nam</lastname> </name> <hiredate>July 15, 2005</hiredate> <projects> <project> <product>Printer</product> <id>HP2300</id> <price>$111.00</price> </project> <project> <product>Laptop</product> <id>DELL1100 </id> <price>$989.00</price> </project> </projects> </employee> </document>
Kiểm tra sự hợp lệ và khuôn dạng của tài liệu rồi xem kết quả do bộ kiểm tra trả về. kết quả kiểm tra cho thấy tài liệu không hợp lệ với thông điệp lỗi trong cửa sổ Error Message là “An XML element is not allowed inside a DTD “.
2.5.12.3. Tạo cú pháp cho phần tử
Để khai báo cú pháp cho một phần tử trong DTD ngƣời ta dùng phần tử <!ELEMENT>nhƣ sau:
<!ELEMENT name content_model>
Name: Tên phần tử đang khai báo; Content_model: Mô hình nội dung cuả phần tử. Content_model chỉ ra nội dung nào phần tử đƣợc phép có, ví dụ nhƣ cho phép có phần tử con hoặc dữ liệu văn bản, hoặc ngƣời ta tạo phần tử rỗng bằng
cách tạo từ khoá EMPTY, hoặc cho phép bất kỳ nội dung nào bằng cách dùng từ khoá ANY.
Ví dụ sau khai báo phần tử <document>: <!DOCTYPE document [
<!ELEMENT document (employee)*> . .
] >
với khai báo trên, phần tử <document> có thể chứa phần tƣ <employee>.
2.5.12.4. Quản lý nội dung bất kỳ
Nếu ngƣời ta cho phần tử có mô hình nội dung là ANY thì nó có thể chứa bất kỳ nội dung nào. Ví dụ phần tử <document> sau đây có thể chứa bất kỳ nội dung gì:
<!DOCTYPE document [ <!ELEMENT document ANY > …
]>
2.5.12.5. Chỉ ra phần tử con
Ngƣời ta có thể chỉ ra một phần tử có thể chứa những phần tử con nào trong mô hình nội dung của phần tử đó. Chỉ ra phần tử con bằng cách liệt kê tên của phần tử con trong dấu ngoặc đơn.
Ví dụ trên khai báo phần tử <document> chứa phần tử <employee> và dấu * nghĩa là phần tử <document> có thể chứa số phần tử <employee> bất kỳ. phần tử <employee> chứa các phần tử <name>, <hiredate>, <projects>….
<?xml version=”1.0” encoding=”UTF-8” standalone=”yes”?> <!DOCTYPE document [
<!ELEMENT document (employee)*>
<!ELEMENT employee (name, hiredate, projects)> <!ELEMENT name (firstname, lastname)>
<document> <employee> <name> <firstname>Nguyen</firstname> <lastname>Son Nam</lastname> </name> <hiredate>July 15, 2005</hiredate> <projects> <project>
<product>Printer</product> <id>HP2300</id> <price>$111.00</price> </project> <project> <product>Laptop</product> <id>DELL1100 </id> <price>$989.00</price> </project> </projects> </employee> …. </document>
Liệt kê nhiều phần tử trong mô hình nội dung theo cách này gọi là tạo tuần tự, dùng dấu phẩy để phân cách các phần tử. Sau đó các phần tử sẽ xuất hiện theo tuần tự đó trong tài liệu XML. Trong ví dụ trên khai báo:
<!ELEMENT employee (name, hiredate, projects)>
Thì trong phẩn tử <employee> phần tử <name> phải xuất hiện trƣớc tiên, kế đến là<hiredate> và sau cùng là <project>.
2.5.12. 6. Quản lý nội dung văn bản
Trong các ví dụ trên các phần tử <name>, <hiredate>, <project> chứa dữ liệu văn bản. Trong DTD văn bản không đánh dấu (không phải là thẻ) đƣợc xem là dữ liệu ký tự phân tíc đƣợc. Để chỉ ra dữ liệu ký tự phân tích đƣợc trong DTD ngƣời ta dùng #PCDATA. Đây chỉ là cách để tham khảo đến dữ liệu văn bản trong DTD, nó không thể nói bất kỳ điều gì vể định dạng thật sự của văn bản mặc dù điều này có thể quan trọng nếu ngƣời ta làm việc với số. Chính vì sự thiếu chính xác này là một trong những lý do lƣợc đồ XML đƣợc giới thiệu nhƣ là một cách thay thế DTD.
Ví dụ các phần tử chứa văn bản trong mô hình nội dung #PCDATA nhƣ sau:
<?xml version=”1.0” encoding=”UTF-8” standalone=”yes”?> <!DOCTYPE document [
<!ELEMENT document (employee)*>
<!ELEMENT employee (name, hiredate, projects)> <!ELEMENT name (firstname, lastname)>
<!ELEMENT firstname (#PCDATA)> <!ELEMENT lastname (#PCDATA)>
<!ELEMENT hiredate (#PCDATA)> <!ELEMENT projects (project)*>
<!ELEMENT project (product, id, price)> <!ELEMENT product (#PCDATA)> <!ELEMENT id (#PCDATA)> <!ELEMENT price (#PCDATA)> ]>
<document> …
</document>
2.5.12.7. Chỉ ra nhiều phần tử con
Có một số cách tuỳ chọn để khai báo một phần tử có thể chứa các phần tử con. Ví dụ khai báo phần tử <document> chỉ chứa duy nhất một phần tử <employee>:
<!ELEMENT document (employee)>
Ví dụ khai báo phần tử <document> chứa danh sách các phần tử con: <!ELEMENT document (employee, contractor, partner)>
Ngƣời ta cũng có thể sử dụng một số ký hiệu mang ý nghĩa đặc biệt. nhƣ dấu * có nghĩa phần tử có thể chứa nhiều phần tử con hoặc không chứa phần tử nào.
Ví dụ phần tử <document> chứa nhiều (hoặc không) phần tử <employee>: <!ELEMENT document (employee)*>
Danh sách một số ký hiệu mang ý nghĩa đặc biệt: X+ : Phần tử X có thể xuất hiện một hoặc nhiều lần.
X* : Phần tử X có thể xuất hiện nhiều lần hoặc không lần nào. X? : Phần tử X có thể xuất hiện một lần hoặc không lần nào. X,Y : Phần tử Y xuất hiện sau phần tử X.
X/Y : Xuất hiện phần tử X hoặc Y, không thể xuất hiện cả 2
2.5.12.8. Cho phép phần tử rỗng
Các phần tử có thể không cần có nội dung gì khi đó phần tử đƣợc gọi là rỗng. Ngƣời ta có thể khai báo phần tử rỗng bằng cách dùng DTD với từ khoa EMPTY. Phần tử không thể chứa bất kỳ nội dung gì nhƣng nó có thể chứa thuộc tính. Ví dụ khai báo phần tử <quantity> là rỗng nhƣ sau:
Xem ví dụ khai báo phần tử <employee> có thể chứa phần tử rỗng <intern> và chỉ ra đây là phần tử tuỳ chọn:
<?xml version=”1.0” standalone=”yes”?> <!DOCTYPE document [
<!ELEMENT document (employee)*>
<!ELEMENT employee (intern?, name,hiredate, projects)> <!ELEMENT name (firstname, lastname)>
<!ELEMENT firstname (#PCDATA)> <!ELEMENT lastname (#PCDATA)> <!ELEMENT hiredate (#PCDATA)> <!ELEMENT projects (project)*>
<!ELEMENT projectc (product, id, price)> <!ELEMENT product (#PCDATA)> <!ELEMENT id (#PCDATA)> <!ELEMENT price (#PCDATA)> <!ELEMENT intern EMPTY> ]> <document> <employee> <name> <firstname>Nguyen</firstname> <lastname>Son Nam</lastname> </name> <hiredate>July 15, 2005</hiredate> <projects> <project> <product>Printer</product> <id>HP2300</id> <price>$111.00</price> </project> <project> <product>Laptop</product> <id>DELL1100 </id> <price>$989.00</price> </project> </projects> </employee> … </document> 2.5.13. Cách ghi chú trong DTD
DTD có thể rất dài và phức tạp, do đó ngƣời ta cần dùng ghi chú cho dễ nhớ. Ngƣời ta có thể dùng cách ghi chú XML chuẩn trong DTD (dùng dấu <!- - và - ->). Ví dụ:
<!- - Khai báo phần tử gốc - ->
<!ELEMENT document (employee) *>
<!- -Mỗi phần tử employee chứa phần tử name, hiredate, và project- -> <!ELEMENT employee (name, hiredate, projects)>\
2.6. Các ngôn ngữ truy vấn XML
2.6.1. XPath
Để xử lý một tài liệu XML, chƣơng trình ứng dụng phải có cách di chuyển bên trong tài liệu để lấy ra giá trị của các phần tử hay thuộc tính. Do đó ngôn ngữ XML Path đƣợc ra đời, mà chúng ta gọi tắt là XPath. XPath đóng một vai trò quan trọng trong việc truy vấn dữ liệu cho các chƣơng trình ứng dụng vì nó cho phép ta lựa chọn hay sàng lọc ra những phần tử nào mình muốn để trao đổi hay hiển thị.
Nếu khi làm việc với cơ sở dữ liệu ta dùng các phát biểu SQL nhƣ SELECT .. FROM tên bảng WHERE ... để trích ra một số mẩu tin từ một bảng, thì khi làm việc với tập tin XML, XPath cho ta những biểu thức về điều kiện giống nhƣ mệnh đề WHERE trong SQL.
XPath là một ngôn ngữ dùng để xử lý truy vấn trên tài liệu XML, cũng giống nhƣ SQL là một chuẩn để làm việc với cơ sở dữ liệu. Một biểu thức XPath có thể chỉ ra vị trí và mẫu nào để kết hợp. Chúng ta có thể áp dụng toán tử boolean, hàm string, và toán tử số học trong biếu thức XPath để xây dựng câu truy vấn phức tạp trên tài liệu XML. XPath cũng cung cấp một số hàm về số nhƣ tính tổng, hàm làm tròn…
2.6.2. XQuery
XQuery là ngôn ngữ truy vấn tài liệu XML, nó giống nhƣ ngôn ngữ truy vấn cơ sở dữ liệu quan hệ SQL. XQuery cho phép các nhà phát triển ứng dụng sử dụng các biểu thức để lấy dữ liệu ra từ các tài liệu XML. Dữ liệu đó có thể là một giá trị hoặc là cả một cấu trúc cây con của tài liệu, chẳng hạn là một thành phần với tất cả các thành phần con của nó.
XQuery sử dụng các biểu thức XPath, liên quan đến các từ khóa FLWOR nổi tiếng: for, let, where, order by, và return. Những từ khóa trên cung cấp
phƣơng thức mạnh mẽ để tách và lấy dữ liệu từ tài liệu XML trong hầu hết các trƣờng hợp.
Cấu trúc ngữ pháp của ngôn ngữ XQuery đƣợc dựa trên cấu trúc cây của chính tài liệu XML. XQuery xử lý tốt cả các chỉ lệnh, thuộc tính và các thành phần .
2.6.3. XSL
XSL là ngôn ngữ định kiểu mở rộng, tƣơng tự CSS, nó biến đổi dữ liệu XML và hiển thị cho ngƣời dùng cuối một tƣ liệu đã định dạng theo kiểu HTML.
Hình 2.4: Mối quan hệ giữa các thành phần trong XML
2.6.3.1. Cấu trúc tệp XSL <?xml version="1.0"?> <xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"> <!- - Các câu lệnh XSL, HTML khác - -> </xsl:stylesheet> xmlns: XML Name Space - Phần tử <xml:template match=”/”> <?xml version="1.0" encoding="UTF-8"?> <xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"> <xsl:template match="/"> <html>
<head> //khai báo CSS</head> <body>
<table>
<tr><th>Họ tên </th><th>Lớp </th><th>Địa chỉ</th></tr> <tr>
<td><xsl:value-of select="DCT/Student/FullName"/></td> <!– Các thẻ TD khác, tƣơng tự nhƣ trên --> </tr> </table> </body> </html> </xsl:template> </xsl:stylesheet> 2.6.3.2. Phần tử <xsl:value-of select=“path"/>
Chức năng: trích xuất dữ liệu của một nút đƣợc chỉ định trong path. Ví dụ <xsl:value-of select=“DCT/Student/Fullname"/>
Trích dữ liệu trong node <Fullname> trong tệp DCT.XML
Phần tử <xsl:for-each select=“path”/> có chức năng: Duyệt qua các phần tử đƣợc chỉ định trong path. Ví dụ: duyệt tất cả các node Student của tệp DCT.XML, bản chất là một vòng lặp <xsl:for-each… select=“DCT/Student"> <tr> <td><xsl:value-of select=“Fullname"/></td> <td><xsl:value-of select=“Class"/></td> <td><xsl:value-of select=“Address"/></td> </tr> </xsl:for-each> 2.6.3.3. Phần tử <xsl:sort select=“element” />
Chức năng: sắp xếp theo dữ liệu trong node có tên element,kết quả trích xuất & trình bày dƣới dạng HTML. Ví dụ : Sắp danh sách sinh viên theo họ
<xsl:for-each select=“DCT/Student"> <xsl:sort select=“FullName” /> <tr> <td><xsl:value-of select=“Fullname"/></td> <td><xsl:value-of select=“Class"/></td> <td><xsl:value-of select=“Address"/></td> </tr> </xsl:for-each>
Phần tử <xsl:if test=“Criteria”> có chức năng: xác định điều kiện lọc dữ liệu theo điều kiện đã mô tả trong Critera.
Ví dụ: Hiển thị danh sách học viên lớp K9 <xsl:for-each select="DCT/Student"> <xsl:if test="Class='K9'"> <tr> <td><xsl:value-of select="FullName"/></td> <td><xsl:value-of select="Class"/></td> <td><xsl:value-of select="Address"/></td> </tr> </xsl:if> </xsl:for-each> 2.6.3.4. Sử dụng các thực thể ký tự HTML
Khi sử dụng <xsl:if test=“criteria”/>; trong đó Criteria đƣợc xây dựng từ biểu thức so sánh, phải dùng thực thể ký tự HTML:
= : bằng
!= : khác
> : lớn hơn < : nhỏ hơn
Phần tử <xsl:choose> có chức năng: lựa chọn những node thỏa mãn điều kiện xác định. Cú pháp : <xsl:choose> <xsl:when test="expression"> ... some output ... </xsl:when> <xsl:otherwise> ... some output .... </xsl:otherwise> </xsl:choose>
Phần tử <xsl:choose> hoạt động nhƣ câu lệnh điều khiển switch <xsl:for-each select=“DCT/Student"> <tr> <td><xsl:value-of select=“FullName"/></td> <xsl:choose> <xsl:when test=“Class=‟08T1‟"> <td bgcolor="#ff00ff"> <xsl:value-of select=“Class"/></td> </xsl:when> <xsl:otherwise> <td><xsl:value-of select=“Class"/></td> </xsl:otherwise> </xsl:choose> <td><xsl:value-of select=“Address"/></td> </tr>
</xsl:for-each>
Đây là phƣơng pháp để định dạng những phần tử thỏa điều kiện nào đó theo cách riêng biệt!
2.7. Kết luận
Trên đây là những trình bày các khía cạnh chính của XML. Nội dung tìm hiểu đơn giản, nhƣng đòi hỏi học viên cố gắng nhiều để hiểu về ngôn ngữ chƣa từng quen sử dụng. Mặt khác, với mục đích thử nghiệm tìm kiếm thông tin trên văn bản XML, trên Internet, những vấn đề liên quan đến XML có ý nghĩa đối với chƣơng tiếp theo, cho phép thử nghiệm với bài toán thực tế tại Thái Nguyên.