Bài 3
Đi lại trong XML bằng XPATH (phần II)
Collections
Cái bộ (Set of) Nodes do XPath trả về được gọi là Collection. Thông thường trong lập trình, từ "Collection" được dùng để nói đến một tập hợp các objects đồng loại. Ta có thể lần lượt đi qua (iterate through) các objects trong một Collection nhưng không được bảo đảm thứ tự của chúng, tức là gặp object nào trước hay object nào sau.
Trái lại, trong chuẩn XPath, khi một Collection được trả về bởi một XPath Query (hỏi), nó giữ nguyên thứ tự các Nodes và cấp bậc của chúng trong tài liệu XML. Tức là nếu XPath trả về một cành các nodes thì trừ những nodes không thỏa điều kiện, các node còn lại vẫn giữ đúng vị trí trên cành.
Vì các Attributes của một Element không có thứ tự, nên chúng có thể nằm lộn xộn trong một Collection.
Indexing trong một Collection
Một Collection của Nodes được xem như một Array. Muốn nói trực tiếp đến một Node trong Collection ta có thể dùng một index trong cặp ngoặc vuông. Node thứ nhất có Index là 1.
Cặp ngoặc vuông ([]) có precedence cao hơn (được tính trước) dấu slash(/) hay hai dấu slash (//). Dưới đây là hai thí dụ:
Expression Ý nghĩa
author[1] Element author đ u tiên. ầ
author[firstname][3] firstname con. Element author th ba có m t Element ứ ộ
Mối liên hệ (Axes)
Một location path dùng một Axis để chỉ định mối liên hệ giữa các Nodes được chọn đối với context node. Sau đây là bảng liệt kê đầy đủ các axes:
Axes Ý nghĩa
ancestor::
T tiên c a context node. ủ ổ
ancestor-or-self::
tiên c a context node g m có cha, ông n i, ông c .v.v., do đó ổ ủ ộ ồ ố ể ả ừ Nh ng t ữ ancestor:: axis luôn luôn k c root node tr khi chính context node là root node.
Chính context node và t ổ tiên c a nó. ủ
attribute::
ể ả Cái ancestor-or-self:: axis luôn luôn k c root node.
Các Attributes c a context node. ủ
child::
ẽ ố ắ ắ ả ộ N u context node không ph i là m t Element thì ch c ch n axis s tr ng ế r ng.ỗ
Con cái c a context node. ủ
descendant::
i context node trong tree. Tuy ộ ấ ứ ướ ằ c xem là con cái c a ượ ủ M t con là b t c node nào n m ngay d nhiên, Attribute hay Namespace nodes không đ context node.
Con cháu c a context node. ủ
following::
Con cháu là con, cháu, chít, .v.v., do đó descendant:: ch a Attribute hay Namespace nodes. ứ
following-sibling::
ọ ể M i nodes hi n ra sau context node trên tree, không k con cháu, Attribute ệ nodes, hay Namespace nodes.
M i nodes em (n m sau) context node. ằ ọ
following-sibling:: axis nói đ n ch nh ng Nodes con, c a cùng m t Node cha, n m trên tree sau context node. Axis không k các Nodes anh n m tr
following-sibling::
ỉ ữ ộ ủ ế ằ ể ằ c context node. ướ
namespace::
N u context node là Attribute hay Namespace thì ế s tr ng r ng. ẽ ố ỗ
Nh ng Namespace nodes c a context node. ữ ủ
ạ ộ ạ ộ M i namespace có m t namespace node trong scope (ph m vi ho t đ ng) ỗ c a context node. ủ
parent::
N u context node không ph i là m t Element thì Axis s tr ng r ng. ộ ẽ ố ế ả ỗ
Node cha c a context node, n u nó có cha. ủ ế
preceding::
Node cha là node n m ngay phía trên context node trên tree. ằ
c context node trên tree, không k các nodes t tiên, ọ ướ ệ ể ổ M i nodes hi n ra tr Attribute nodes, hay Namespace nodes.
preceding-sibling::
ậ ế ệ preceding:: axis là m i nodes đã k t thúc hoàn ọ M t cách đ nh n di n ể ộ toàn tr c khi context node b t đ u. ướ ắ ầ
M i nodes anh (n m tr c) context node. ằ ọ ướ
preceding-sibling:: axis nói đ n ch nh ng Nodes con, c a cùng m t ỉ ữ Node cha, n m trên tree tr c context node. ằ
preceding-sibling::
ủ ế ộ ướ
self::
N u context node là Attribute hay Namespace thì ế s tr ng r ng. ẽ ố ỗ
Là chính context node.
Sàng lọc (Filters)
Như ta đã thấy ở trên, để giới hạn chỉ lấy ra những Nodes thỏa đáng một điều kiện, ta gắn một Filter (sàng lọc) vào Collection. Filter ấy là một Clause giống giống Clause WHERE trong ngôn ngữ SQL của cơ sở dữ liệu.
Nếu một Collection nằm giữa một filter, nó sẽ cho kết quả TRUE nếu Collection trả về ít nhất một Node và FALSE nếu Collection trống rỗng (empty). Thí dụ expression author/degree có nghĩa rằng hàm biến đổi Collection ra trị số Boolean sẽ có giá trị TRUE nếu hiện hữa một Element author có Element con tên degree.
Filters luôn luôn được tính theo context của nó. Nói một cách khác, cái expression book[author] có nghĩa là cho mỗi Element book tìm thấy, nó sẽ được thử xem có chứa một Element con tên author không. Tương tự như vậy, book[author = 'Brown'] có nghĩa rằng cho mỗi Element book tìm thấy, nó sẽ được thử xem có chứa một Element con tên author với trị số bằng Brown không.
Ta có thể dùng dấu chấm (.) để khám current context node. Thí dụ như, book[. = 'Dreams'] có nghĩa rằng cho mỗi Element book tìm thấy trong current context, nó sẽ được thử xem có trị số bằng Dreams không. Dưới đây là một ít thí dụ:
Expression Ý nghĩa
book[excerpt] M i Element book có ch a ít nh t m t Element excerpt ọ ứ ấ ộ
book[excerpt]/title book có ch a ít nh t ữ ấ ứ M i Element m t Element title n m trong nh ng Element ằ excerpt. ọ ộ
book[excerpt]/author[degree] author có ch a ít nh t m t Element ọ ứ M i Element trong nh ng Elements ộ book có ch a ít nh t m t Element ấ ứ ữ ấ ộ
book[author/degree] author ấ ộ M i Element m t Element book có ch a ít nh t m t Element ứ degree con. ọ ộ
book[excerpt][title] excerpt ứ ấ ộ M i Element m t Element book có ch a ít nh t m t Element title. ọ ộ
So sánh
Để so sánh hai objects trong XPath ta dùng dấu (=) cho bằng nhau và (!= ) cho không bằng nhau. Mọi Element và Attributes là string, nhưng được Typecast (xem như ) những con số khi đem ra so sánh.
Expression Ý nghĩa
author[lastname = "Smith"] author có ch a ít nh t m t Element ứ ấ ộ Smith. M i Element ọ s b ng ố ằ
author[lastname[1] = "Smith"] author có Element lastname con đ u tiên v i tr s ớ ị ố ầ M i Element ọ Smith. b ng ằ
author/degree[@from != "Harvard"] degree, là con m t Element ọ ộ author, và có m tộ "Harvard" M i Element Attribute from v i tr s không ph i là ớ ị ố ả
author[lastname = /editor/lastname] ọ ộ lastname editor. M i Element author có ch a m t Element ứ Element lastname là con c a root Element ủ
author[. = "John Hamilton"] M i Element author có tr s string là John Hamilton ọ ị ố
Operator Union | (họp lại)
Ngôn ngữ Xpath hỗ trợ Operator Union, giống như Logical OR (hoặc là). Dưới đây là vài thí dụ:
Expression Ý nghĩa
firstname | lastname M i Element firstname và lastname trong current context. ọ
(bookstore/book | bookstore/magazine) M i Element book hay magazine là con m t Element ọ ộ
book | book/author book hay Element author là con nh ng Elements ữ M i Element ọ book.
(book | magazine)/price price là con c a Element book hay Element ủ ọ M i Element magazine.
Thử loại Node (Node Type Tests)
Để chọn những loại Node khác hơn là Element node, ta dùng NodeType Test. Mục đích của việc dùng NodeType test là để chỉ định sự lựa chọn khác thường. Thí dụ như, descendant::text() cho ta mọi text nodes là con cháu của context node, dù rằng loại node chính của con cháu context node là Element. Có 4 loại NodeType tests như liệt kê dưới đây.
Node type Tr vả ề Thí dụ
comment() m i comment node. ọ ọ following::comment() ch n m i comment ọ nodes hi n ra sau context node. ệ
node() m i node. ọ ệ ọ preceding::node() ch n m i nodes hi n ra ọ tr c context node. ướ
processing-instruction() m i processing instruction node. ọ ọ ọ self::processing instruction() ch n m i processing instruction nodes trong context node.
text() m i text node. ọ ủ child::text() ch n m i text nodes là con c a ọ ọ the context node.
Thử Node nhắm vào loại Processing Instruction
processing-instruction("target")
Một node test có thể chọn processing instruction thuộc loại nào, tức là chọn mục tiêu (target). Cú pháp của một loại test như thế là:
/child::processing-instruction("xml-stylesheet")
Thí dụ node test sau đây trả về mọi processing instruction nodes có nhắc đến một XSL stylesheet trong tài liệu:
Thêm một số thí dụ Location Path
Expression Ý nghĩa
./author author trong current context. ọ M i Element Expresion n y t ng đ ng v i expression trong hàng k . ầ ươ ươ ế ớ
author M i Element author trong current context. ọ
/bookstore Document (Root) Element tên bookstore c a tài li u n y. ủ ệ ầ
//author M i Element ọ author trong tài li u.ệ
book[/bookstore/@specialty = @style] ọ book có Attribute style v i value b ng value c a ớ ủ ằ bookstore M i Element Attribute specialty c a Document Element ủ
author/firstname M i Element author ọ firstname con c a các Elements ủ
bookstore//title ộ ứ ề ấ ơ title m t hay nhi u b c th p h n, t c là con cháu ậ bookstore. L u ý là expression n y khác v i ớ ư ầ M i Element ọ c a, Element ủ expression trong hàng k .ế
bookstore/*/title M i Element title cháu c a các bookstore. ọ ủ
bookstore//book/excerpt//emph ọ ữ ủ M i Element elements book , b t c n i nào d ướ excerpt là con c a nh ng i bookstore i element emph b t c n i nào d ấ ứ ơ ướ ấ ứ ơ
.//title title m t hay nhi u b c th p h n current context ề ậ ấ ộ ơ M i Element ọ node.
author/* author. M i Element là con c a các elements con ủ ọ
book/*/lastname M i Element ọ lastname là cháu c a các elements con ủ
*/* M i Element cháu c a current context node. ủ ọ
*[@specialty] M i Element con có Attribute specialty. ọ
@style Attribute style c a current context node. ủ
price/@exchange price trong current ữ price c a current context node. Attribute exchange c a nh ng Elements ủ context, t c là nh ng Elements ủ ứ ữ
price/@exchange/total ả ề ộ ỗ ấ ủ ạ ậ Tr v m t node set tr ng r ng, vì Attributes không có Element ố c ch p nh n trong văn ph m c a XML con. Expression n y đ ầ ượ . Path Language, nh ng không th t s h p l ư ậ ự ợ ệ
book[@style] book có Attribute style trong current context node. ằ ệ ủ ề ầ ặ M i Element ọ L u ý ph n n m trong ngo c vuông là đi u ki n c a Element ư book
book/@style booktrong current context node. ọ đây không có đi u ki n nh hàng trên. Ta nói đ n Attribute hay ế ư ề ệ Attribute style c a m i Element ủ Ở Element n m bên ph i nh t. ằ ả ấ
@* M i Attributes c a current context node. ủ ọ
author[1] Element author th nh t trong current context node. ứ ấ
author[firstname][3] Element author th ba có m t Element con firstname ứ ộ
my:book Element book t namespace my. ừ
my:* M i Element trong namespace my. ọ