mở đầu. Dưới đây là một thí dụ có Processing Instruction trong đoạn mả đầu của một tài liệu XML: <?xml version="1.0" encoding="utf-8" standalone="yes"?> <Order> <OrderDate>2002-6-14</OrderDate> <Customer>Helen Mooney</Customer> <Item> <ProductID>1</ProductID> <Quantity>2</Quantity> </Item> <Item> <ProductID>4</ProductID> <Quantity>1</Quantity> </Item> </Order> Có một loại Processing Instruction khác cũng rất thông dụng là cho biết tên của stylesheet (kiểu dáng) của XML nầy, thí dụ như: <?xml-stylesheet type="text/xsl" href="order.xsl"?> Ở đây ta cho XML stylesheet parser biết rằng stylesheet thuộc loại text/xsl và nó được chứa trong file tên order. Chúng ta cũng có thể cho thêm chú thích bằng cách dùng cặp Tags <!-- và --> như sau: <?xml version="1.0" encoding="utf-8" standalone="yes"?> <!-- Below are details of a purchase order. --> <Order> <OrderDate>2002-6-14</OrderDate> <Customer>Helen Mooney</Customer> <Item> <ProductID>1</ProductID> <Quantity>2</Quantity> </Item> <Item> <ProductID>4</ProductID> <Quantity>1</Quantity> </Item> </Order> 6 Ngoài những vấn đề đề cập ở trên nhưng có một ý niệm rất quan trọng trong XML là Namespace (không gian tên).
Nó cho ta cách cùng một tên của phần tử để nói đến hai thứ dữ liệu khác nhau trong cùng một tài liệu XML. Giống như có hai học sinh trùng tên Tuấn trong lớp học, ta phải dùng thêm họ của chúng để phân biệt, ta gọi Tuấn Trần hay Tuấn Lê. Thí dụ như có một order được người ta đặt trong tiệm sách như sau: <?xml version="1.0"?> <BookOrder OrderNo="1234"> <OrderDate>2001-01-01</OrderDate> <Customer> <Title>Mr.</Title> <FirstName>Graeme</FirstName> <LastName>Malcolm</LastName> </Customer> <Book> <Title>Treasure Island</Title> <Author>Robert Louis Stevenson</Author> </Book> </BookOrder> Khi quan sát kỹ, ta thấy có thể có sự nhầm lẫn về cách dùng phần tử Title. Trong tài liệu có hai loại Title, một cái dùng cho khách hàng Customer nói đến danh hiệu Mr., còn cái kia để nói đến đề tựa của một quyển sách Book.
Để tránh sự lầm lẫn, chúng ta có thể dùng không gian tên để nói rõ tên phần tử ấy thuộc về giòng họ nào. Giòng họ ấy là một Universal Resource Identifier (URI). Một URI có thể là một URL hay một chỗ nào định nghĩa tính cách độc đáo của nó. Một không gian tên cũng không cần phải nói đến một địa chỉ Internet, nó chỉ cần phải là có một, không hai.
Chúng ta có thể khai báo các không gian tên trong một phần tử bằng cách dùng thuộc tính xmlns (ns trong chữ xmlns là viết tắt cho namespace) chúng ta cũng có thể khai báo một không gian tên mặc định để áp dụng cho những gì nằm bên trong một phần tử, nơi chúng ta khai báo không gian tên. Thí dụ cái tài liệu đặt hàng có thể được viết lại như sau: <?xml version="1.0"?> <BookOrder OrderNo="1234"> <OrderDate>2001-01-01</OrderDate> <Customer xmlns="http://www.com/customer"> <Title>Mr.</Title> <FirstName>Graeme</FirstName> <LastName>Malcolm</LastName> </Customer> <Book xmlns="http://www.com/book"> <Title>Treasure Island</Title> <Author>Robert Louis Stevenson</Author> </Book> </BookOrder> Ta đã tránh được sự nhầm lẫn vì bên trong Customer thì dùng namespace http://www.com/customer và bên trong Book thì dùng namespace http://www. Tuy nhiên, ta sẽ giải quyết làm sao nếu trong order có nhiều customer và nhiều book. Nếu cứ thay đổi không gian tên hoài trong tài liệu thì rất khó khăn.
Một cách giải quyết là khai báo chữ viết tắt cho các không gian tên ngay ở đầu tài liệu, trong phần tử góc (tức là phần tử tài liệu). Sau đó bên trong tài liệu ta sẽ sử dụng tiếp đầu ngữ cho các phần tử cần xác nhận không gian tên bằng chữ viết tắt của không gian tên của nó. Thí dụ như sau: <?xml version="1.0"?> <BookOrder xmlns="http://www.com/order" xmlns:cust="http://www.com/customer" xmlns:book="http://www.com/book" OrderNo="1234"> <OrderDate>2001-01-01</OrderDate> <cust:Customer> <cust:Title>Mr.</cust:Title> 7 <cust:FirstName>Graeme</cust:FirstName> <cust:LastName>Malcolm</cust:LastName> </cust:Customer> <book:Book> <book:Title>Treasure Island</book:Title> <book:Author>Robert Louis Stevenson</book:Author> </book:Book> </BookOrder> Trong tài liệu XML trên ta dùng 3 không gian tên và một không gian tên mặc định. Không gian tên http://www.com/order, namespace http://www.com/customer (viết tắt là cust) và namespace http://www.
Các phần tử và các thuộc tính không có tiếp đầu (tức là không có chữ tắt đứng trước) như BookOrder, OrderNo, và OrderDate, được coi như thuộc về không gian tên mặc định. Để đánh dấu một phần tử hay thuộc tính không thuộc về không gian tên mặc định, một chữ tắt, đại diện không gian tên sẽ được gắn làm tiếp đầu ngữ cho tên phần tử hay thuộc tính. Thí dụ như cust:LastName, book:Title. Trong tài liệu XML còn có CDATA, là khúc dữ liệu trong tài liệu XML nằm giữa <![CDATA[ và ]]>.
Dữ liệu nằm bên trong những CDATA được cho thông qua parser y nguyên, không bị sửa đổi. Điểm nầy rất quan trọng khi chúng ta muốn cho vào những dữ liệu có chứa những văn bản được xem như đánh dấu. Chúng ta có thể đặt những thí dụ cho XML trong những CDATA và chúng sẽ được parser bỏ qua. Khi dùng XSL stylesheets để transform một XML file thành HTML, có bất cứ scripting nào chúng ta cũng phải đặt trong những CDATA.
Dưới đây là các thí dụ dùng CDATA: <![CDATA[.place your data here.]]> <SCRIPT> <![CDATA[ function warning() { alert("Watch out!"); }]]> </SCRIPT> Dữ liệu trong XML không cho phép dùng một số ký hiệu đặc biệt. Do đó, XML yêu cầu chúng ta sử dụng một số cụm từ thay thế. Cụm từ Ý nghĩa ' dấu nháy trên & dấu & > dấu lớn hơn < dấu nhỏ hơn " dấu ngoặc kép Chúng ta đã thấy cấu trúc và cú pháp của XML tương đối đơn giãn. XML cho ta một cách chuẩn để trao đổi tin tức giữa các computers.
Bước tiếp theo là tìm hiểu cách nào một chương trình xử lý một tài liệu XML. Dĩ nhiên để xử lý một XML chương trình ứng dụng phải có cách đi lại bên trong tài liệu để lấy ra các giá trị của các phần tử hay thuộc tính. Do đó người ta thiết kế ra ngôn ngữ XML Path language, mà ta gọi tắt là XPath. XPath đóng một vai trò quan trọng trong công tác trao đổi dữ liệu giữa các computers hay giữa các chương trình ứng dụng vì nó cho phép ta lựa chọn hay lọc ra những tin tức 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ấu câu lệnh SQL Select. from TableXYZ WHERE. để trích ra một số bản ghi từ một table, thì khi làm việc với XML, một table dữ liệu nho nhỏ, XPath cho ta những biểu thức về điều kiện giống giống như mệnh đề WHERE trong SQL. XPath là một chuẩn để xử lý XML, cũng giống như SQL là một chuẩn để làm việc với cơ sở dữ liệu.
Tiên phuông trong việc triển khai các chương trình áp dụng XPath là công tác của các công ty phần mềm lớn như Microsoft, Oracle, Sun, IBM, v. Sở dĩ ta cần có một 8 chuẩn XPath là vì nó được áp dụng trong nhiều hoàn cảnh, nên cần phải có một lý thuyết rõ ràng, chính xác. Lý thuyết về XPath hơi khô khan nhưng nó được áp dụng trong mọi kỹ thuật của gia đình XML. Cho nên chúng ta hãy kiên nhẫn nắm vững những điều căn bản về nó để khi nào gặp chỗ người ta dùng XPath thì mình nhận diện và hiểu được.
Chúng ta ta sẽ chỉ nghiên cứu những nội dung thường dùng trong XPath thôi, nếu chúng ta muốn có đầy đủ chi tiết về XPath thì có thể tham khảo chỉ định của nó tại địa chỉ http://www.org/TR/xpath. Một tài liệu XML như một cây đối với XPath XPath cho ta cú pháp để diễn tả cách đi lại trong XML. Ta coi một tài liệu XML như được đại diện bằng một tree (cây) có nhiều các nút. Mỗi phần tử hay thuộc tính là một nút.
Để minh họa ý niệm nầy, chúng ta hãy quan sát tài liệu đặt hàng (order) XML sau: <?xml version="1.0"?> <Order OrderNo="1047"> <OrderDate>2002-03-26</OrderDate> <Customer>John Costello</Customer> <Item> <Product ProductID="1" UnitPrice="70">Chair</Product> <Quantity>6</Quantity> </Item> <Item> <Product ProductID="2" UnitPrice="250">Desk</Product> <Quantity>1</Quantity> </Item> </Order> Ta có thể biểu diễn XML trên bằng một cây như dưới đây, trong đó nút phần tử màu nâu, nút thuộc tính màu xanh: 9 Chúng ta có thể dùng biểu thức XPath để chỉ định đường dẫn đến nút (nút) nào hay trích ra (trả về) một hay nhiều nút thỏa đúng điều kiện yêu cầu. Biếu thức XPath có thể là tuyệt đối, tức là lấy nút gốc làm chuẩn hay tương đối, tức là khởi đầu từ nút vừa mới được chọn. Nút ấy được gọi là context nút (nút vai chính trong tình huống). Có hai cách viết để diễn tả XPath, viết nguyên và viết tắt.
Trong cả hai cách ta đều dùng dấu slash (/) để nói đến phần tử tài liệu, tức là nút gốc. Ta có thể đi lại trong các nút của Tree giống như các nút của Windows System Directory mà ta thấy trong Panel bên trái của Window Explorer. Ta cũng sẽ dùng những ký hiệu như slash /, một chấm. và hai chấm.
của Windows System File Folder cho cách viết tắt trong XPath Location để đi xuống các các nút con, cháu, chỉ định context nút, hay đi ngược lên các các nút tổ tiên. Đường dẫn tuyệt đối Chúng ta hãy tìm vài location paths trong cái Tree của tài liệu XML về đặt hàng nói trên. Muốn chọn cái nút của Phần tử Order (nó cũng là Root Phần tử) bằng cú pháp nguyên, ta sẽ dùng XPath Biểu thức sau đây: /child::Order Dịch ra cú pháp tắt, Biểu thức nầy trở nên: /Order Đi ra nhánh của Tree, ta sẽ tìm được nút Customer bằng cách dùng XPath Biểu thức sau: /child::Order/child::Customer Sau đây là XPath Biểu thức viết tắt tương đương: /Order/Customer Nếu chúng ta muốn lấy ra một nút Thuộc tính, chúng ta phải nói rõ điều nầy bằng cách dùng từ chìa khóa (keyword) thuộc tính trong cách viết nguyên hay dùng character @ trong cú pháp tắt. Do đó để lấy thuộc tính OrderNo của phần tử Order, ta sẽ dùng XPath Biểu thức sau: /child::Order/thuộc tính::OrderNo Cú pháp tắt cho Thuộc tính OrderNo là: /Order/@OrderNo Để trích ra các các nút con cháu, tức là các các nút nhánh xa hơn, ta dùng keyword descendant trong cú pháp nguyên hay một double slash (//) trong cú pháp tắt.
Thí dụ, để lấy ra các các nút Product trong tài liệu, chúng ta có thể dùng Biểu thức location path sau: /child::Order/descendant::Product Cú pháp tắt tương đương là: /Order//Product Chúng ta cũng có thể dùng wildcards (lá bài Joker) để nói đến những các nút mà tên của chúng không thành vấn đề. Thí dụ, dấu asterisk (*) wildcard chỉ định bất cứ nút tên nào. Location path sau đây chọn tất cả các các nút con của Phần tử Order: /child::Order/child::* Cú pháp tắt tương đương là: /Order/* Đường dẫn tương đối: Nhiều khi XPath location paths là tương đối với context nút, trong trường hợp ấy location path diễn tả cách lấy ra một nút hay một số (set of) các nút tương đối với context nút. Thí dụ như, nếu Phần tử Item thứ nhất trong order là context nút, thì location path tương đối để trích ra Phần tử con Quantity là: child::Quantity Trong cú pháp tắt, location path tương đối là: Quantity Tương tự như vậy, để lấy ra Thuộc tính ProductID của Phần tử con Product, cái location path tương đối là: child::Product/thuộc tính::ProductID Biểu thức ấy dịch ra cú pháp tắt là: Product/@ProductID Để đi ngược lên phía trên của Tree, ta dùng keyword parent (cha).
Dạng tắt tương đương của keyword nầy là hai dấu chấm (.