XML có thể sử dụng để lưu trữ dữ liệu có cấu trúc. Ví dụ như bạn muốn lưu danh sách các quyển sách:
<books>
<book id="1">
<title>Lập trình C++ trong 21 ngày<title>
<author>Nguyễn A</author>
</book>
<book id="2">
<title>XML toàn tập<title>
<author>Trần B</author>
</book>
</books>
nhưng mà để thao tác với loại CSDL này thì mình củng chỉ mới tìm hiểu, nguồn của lao5t bài viết này đều trên Google!
Để dọn đường cho các đồng chí dấn thân vào nghiên cứu Semantic Web, hôm nay tôi cung cấp một tài liệu về ngôn ngữ truy vấn XML XQuery, một ngôn ngữ khá đơn giản, dễ dùng và hiện đang được đề xuất để trở thành chuẩn ngôn ngữ truy vấn các tài liệu XML.
I. XQuery là gì?
XQuery (XML Query) là một ngôn ngữ truy vấn thông tin trong XML, cho phép các chương trình ứng dụng truy vấn các dữ liệu quan hệ hay dữ liệu có cấu trúc dạng XML. Đây là một ngôn ngữ mạnh mẽ, ngắn gọn và được thiết kế để xử lý dữ liệu XML.
XQuery có thể được sử dụng nhằm mục đích lấy thông tin để sử dụng trong một dịch vụ Web, tạo các báo cáo tổng hợp, biến đổi dữ liệu XML thành XHTML hoặc tìm kiếm các tài liệu Web, từ đó cho ra các thông tin có liên quan dựa trên các cặp thẻ XML. XQuery cũng có thể được sử dụng để sản sinh ra các cấu trúc RDF hay truy xuất thông tin trên những nền tảng dựa trên XML. Vì bản thân các ngôn ngữ như RDF hay OWL cũng được biểu diễn thông qua XML nên chúng ta cũng có thể sử dụng XQuery để truy vấn thông tin trong các ontology được biểu diễn bởi RDF/OWL.
II. Các biểu thức đường dẫn trong XQuery
XML xác định các nút thông qua các đường dẫn tới các nút đó, với "đầu đường" là phần tử gốc (root element), tiếp theo là các phần tử ...kỵ, cụ, ông, cha, và kết thúc là nút cần truy xuất.
Các biểu thức đường dẫn được sử dụng để định vị các nút và ràng buộc biến đổi.
Ví dụ 1. Biểu thức đường dẫn tìm kiếm trong tài liệu "books.xml" và trả về tất cả các phần tử con là tiêu đề (title) của các nút chapter của tài liệu:
document("books.xml")//chapter/title
Sử dụng các cấu trúc dựa trên cú pháp XML có thể sinh ra các cấu trúc XML trong XQuery.
Ví dụ 2. Cấu trúc sau sinh ra một phần tử "thesis" đối với mỗi giá trị tiêu đề trả về bởi biểu thức đường dẫn $b/title:
<thesis>
{$b/title}
</thesis>
III. Các biểu thức FLWOR
Một trong những tiện ích mạnh mẽ nhất của ngôn ngữ truy vấn XQuery là các biểu thức FLWOR (For, Let, Where, Order by, Return). Biểu thức này tương tự như cấu trúc SELECT - FROM - WHERE của SQL về nhiều mặt. Chúng có thể được dùng để kết nối dữ liệu tới các biến, duyệt qua danh sách, lọc, trình diễn, tái cấu trúc các biến…
Các mệnh đề For và Let được sử dụng để nối kết các biến tới các dữ liệu trung gian; nối kết giữa hai tài liệu, hay hai dãy của các phần tử (item) hoặc sinh ra các luồng dữ liệu.
Mệnh đề Where được sử dụng trong các biểu thức FLWOR để lọc các luồng dữ liệu theo những giới hạn trong các biến của các mệnh đề for và let.
Ví dụ:
for $b in doc("books.xml")//book
where $b/@year = "2000"
return $b/title
Kết quả trả về là các phần tử tiêu đề như:
<title>Data on the Web</title>
Mệnh đề Order by được sử dụng để chỉ định thứ tự các kết quả được trả về bởi mệnh đề where sẽ được xử lý bởi mệnh đề return.
Mệnh đề Return: Sau khi mệnh đề Order by được sử dụng để sắp xếp kết quả, các kết quả này được chuyển sang mệnh đề return, được đánh giá lại một lần nữa và trả về cho người dùng.
IV. Biểu thức điều kiện: if-then-else
Biểu thức điều kiện sẽ cho phép lọc ra một danh sách theo những điều kiện định trước.
Ví dụ:
for $x in doc("books.xml")/bookstore/book
return if ($x/@category="CHILDREN")
then <child>{data($x/title)}</child>
else <adult>{data($x/title)}</adult>
Các biểu thức so sánh
Trong XQuery có 2 cách để so sánh giá trị:
1. So sánh chung: =, !=, <, <=, >, >=
2. So sánh giá trị: eq, ne, lt, le, gt, ge
Ví dụ:
$bookstore//book/@q > 10
Biểu thức trên trả lại true nếu bất kỳ thuộc tính q có giá trị lớn hơn 10
$bookstore//book/@q gt 10
Biểu thức trên trả lại true nếu chỉ có một thuộc tính q trả lại bởi biểu thức, và giá trị của nó lớn hơn 10. Nếu hơn một q được trả lại, một lỗi xuất hiện.
V. Các hàm trong XQuery
Các hàm dựng sẵn trong XQuery
XQuery cung cấp hơn 100 hàm dựng sẵn,các hàm các giá trị chuỗi, số, so sánh ngày và tháng, …
Ví dụ 1: Gọi hàm dựng sẵn trong một thành phần
<name>{uppercase($booktitle)}</name>
Ví dụ 2: Gọi hàm dựng sẵn trong vị từ của một biểu thức đường dẫn
doc("books.xml")/bookstore/book[substring(title,1,5='Harry')]
Ví dụ 3: Gọi hàm dựng sẵn trong mệnh đề let
let $name := (substring($booktitle,1,4))
Các hàm người dùng định nghĩa
Cú pháp
declare function prefix:function_name($parameter AS datatype)
AS returnDatatype
{
(: ...function code here... Smiley
};
Ví dụ:
declare function local:minPrice(
$price as xs:decimal?,
$discount as xs:decimal?)
AS xs:decimal?
{
let $disc := ($price * $discount) div 100
return ($price - $disc)
};
(: Dưới đây là một ví dụ về cách gọi tới hàm ở trên Smiley
<minPrice>{local:minPrice($book/price,$book/discount)}</minPrice>