Bài 3
Đi li trong XML bng XPATH (phn II)
Collections
Cái b (Set of) Nodes do XPath tr v được gi là Collection. Thông thường trong lp
trình, t "Collection" được dùng để nói đến mt tp hp các objects đồng loi. Ta có th
ln lượt đi qua (iterate through) các objects trong mt Collection nhưng không được bo
đảm th t ca chúng, tc là gp object nào trước hay object nào sau.
Trái li, trong chun XPath, khi mt Collection được tr v bi mt XPath Query (hi),
nó gi nguyên th t các Nodes và cp bc ca chúng trong tài liu XML. Tc là nếu
XPath tr v mt cành các nodes thì tr nhng nodes không tha điu kin, các node còn
li vn gi đúng v trí trên cành.
Vì các Attributes ca mt Element không có th t, nên chúng có th nm ln xn trong
mt Collection.
Indexing trong mt Collection
Mt Collection ca Nodes được xem như mt Array. Mun nói trc tiếp đến mt Node
trong Collection ta có th dùng mt index trong cp ngoc vuông. Node th nht có
Index là 1.
Cp ngoc vuông ([]) có precedence cao hơn (được tính trước) du slash(/) hay hai du
slash (//). Dưới đây là hai thí d:
Expression Ý nghĩa
author[1] Element author đầu tiên.
author[firstname][3] Element author th ba có mt Element firstname
Mi liên h (Axes)
Mt location path dùng mt Axis để ch định mi liên h gia các Nodes được chn đối
vi context node. Sau đây là bng lit kê đầy đủ các axes:
Axes Ý nghĩa
ancestor:: T tiên ca context node.
Nhng t tiên ca context node gm có cha, ông n
đó ancestor:: axis luôn luôn k c root node tr kh
i
là root node.
ancestor-or-self:: Chính context node và t tiên ca nó.
Cái ancestor-or-self:: axis luôn luôn k c root no
d
attribute:: Các Attributes ca context node.
Nếu context node không phi là mt Element thì c
h
trng rng.
child:: Con cái ca context node.
Mt con là bt c node nào nm ngay dưới contex
t
nhiên, Attribute hay Namespace nodes không đư
c
context node.
descendant:: Con cháu ca context node.
Con cháu là con, cháu, chít, .v.v., do đó descenda
n
gi cha Attribute hay Namespace nodes.
following:: Mi nodes hin ra sau context node trên tree, khô
n
Attribute nodes, hay Namespace nodes.
following-sibling:: Mi nodes em (nm sau) context node.
following-sibling:: axis nói đến ch nhng Nodes
c
Node cha, nm trên tree sau context node. Axis k
anh nm trước context node.
Nếu context node là Attribute hay Namespace thì
f
axis s trng rng.
namespace:: Nhng Namespace nodes ca context node.
Mi namespace có mt namespace node trong sco
p
động) ca context node.
Nếu context node không phi là mt Element thì
A
parent:: Node cha ca context node, nếu nó có cha.
Node cha là node nm ngay phía trên context nod
e
preceding:: Mi nodes hin ra trước context node trên tree, kh
ô
tiên, Attribute nodes, hay Namespace nodes.
Mt cách để nhn din preceding:: axis là mi no
d
toàn trước khi context node bt đầu.
preceding-sibling:: Mi nodes anh (nm trước) context node.
preceding-sibling:: axis nói đến ch nhng Nodes
c
Node cha, nm trên tree trước context node.
Nếu context node là Attribute hay Namespace thì
p
axis s trng rng.
self:: Là chính context node.
Sàng lc (Filters)
Như ta đã thy trên, để gii hn ch ly ra nhng Nodes tha đáng mt điu kin, ta gn
mt Filter (sàng lc) vào Collection. Filter y là mt Clause ging ging Clause
WHERE trong ngôn ng SQL ca cơ s d liu.
Nếu mt Collection nm gia mt filter, nó s cho kết qu TRUE nếu Collection tr v ít
nht mt Node và FALSE nếu Collection trng rng (empty). Thí d expression
author/degree có nghĩa rng hàm biến đổi Collection ra tr s Boolean s có giá tr
TRUE nếu hin ha mt Element author có Element con tên degree.
Filters luôn luôn được tính theo context ca nó. Nói mt cách khác, cái expression
book[author] có nghĩa là cho mi Element book tìm thy, nó s được th xem có cha
mt Element con tên author không. Tương t như vy, book[author = 'Brown']
nghĩa rng cho mi Element book tìm thy, nó s được th xem có cha mt Element
con tên author vi tr s bng Brown không.
Ta có th dùng du chm (.) để khám current context node. Thí d như, book[. =
'Dreams'] có nghĩa rng cho mi Element book tìm thy trong current context, nó s
được th xem có tr s bng Dreams không. Dưới đây là mt ít thí d:
Expression Ý nghĩa
book[excerpt] Mi Element book có cha ít nht mt Element e
x
book[excerpt]/title Mi Element title nm trong nhng Element boo
k
nht mt Element excerpt.
book[excerpt]/author[degree] Mi Element author có cha ít nht mt Element
nm trong nhng Elements book có cha ít nht
m
excerpt.
book[author/degree] Mi Element book có cha ít nht mt Element a
u
nht mt Element degree con.
book[excerpt][title] Mi Element book có cha ít nht mt Element e
x
nht mt Element title.
So sánh
Để so sánh hai objects trong XPath ta dùng du (=) cho bng nhau và (!= ) cho không
bng nhau. Mi Element và Attributes là string, nhưng được Typecast (xem như )
nhng con s khi đem ra so sánh.
Expression Ý nghĩa
author[lastname = "Smith"] Mi Element author có cha ít nht mt Element
vi tr s bng Smith.
author[lastname[1] = "Smith"] Mi Element author có Element lastname con đầ
u
tr s bng Smith.
author/degree[@from != "Harvard"] Mi Element degree, là con mt Element author,
Attribute from vi tr s không phi là "Harvard
"
author[lastname = /editor/lastname] Mi Element author có cha mt Element lastna
m
vi Element lastname là con ca root Element ed
i
author[. = "John Hamilton"] Mi Element author có tr s string là John Ham
i
Operator Union | (hp li)
Ngôn ng Xpath h tr Operator Union, ging như Logical OR (hoc là). Dưới đây là
vài thí d:
Expression Ý nghĩa
firstname | lastname Mi Element firstnamelastname trong curren
t
(bookstore/book | bookstore/magazine) Mi Element book hay magazine là con mt Ele
m
bookstore.
book | book/author Mi Element book hay Element author là con nh
Elements book.
(book | magazine)/price Mi Element price là con ca Element book hay
E
magazine.
Th loi Node (Node Type Tests)
Để chn nhng loi Node khác hơn là Element node, ta dùng Node-Type Test. Mc đích
ca vic dùng Node-Type test là để ch định s la chn khác thường. Thí d như,
descendant::text() cho ta mi text nodes là con cháu ca context node, dù rng loi node
chính ca con cháu context node là Element. Có 4 loi Node-Type tests như lit kê dưới
đây.
Node type Tr v Thí d
comment() mi comment node. following::comment() chn m
i
nodes hin ra sau context node.
node() mi node. preceding::node() chn mi no
d
trước context node.
processing-instruction() mi processing instruction node. self::processing instruction() c
h
p
rocessing instruction nodes tro
n
node.
text() mi text node. child::text() chn mi text node
s
ca the context node.
Th Node nhm vào loi Processing Instruction
Mt node test có th chn processing instruction thuc loi nào, tc là chn mc tiêu
(target). Cú pháp ca mt loi test như thế là:
processing-instruction("target")
Thí d node test sau đây tr v mi processing instruction nodes có nhc đến mt XSL
stylesheet trong tài liu:
/child::processing-instruction("xml-stylesheet")
Thêm mt s thí d Location Path
Expression Ý nghĩa