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 Node­Type Test. Mục  đích của việc dùng Node­Type 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 Node­Type 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. ọ