XQuery 學習筆記(二)開始FLOWER表達式
上次簡單的介紹了一下XQuery的概況,對XQuery有了一個總體的認識,并基于路徑表達式做了幾個簡單的練習,本次將開始學習XQuery的核心內容:FLOWER表達式。
FLOWER = For、Let、Where、OrderBy、Return,這五個詞是FLOWER表達式的基本組成部分,構成了其整體框架。還是使用Users.xml作為基礎數據進行XQuery查詢。
本系列所有示例代碼均在Altova XMLSpy 2010 Enterprise Edition中調試通過。
Users.xml
<?xml version="1.0" encoding="UTF-8"?>
<Users>
<User id="1">
<Name>Tom</Name>
<Age>12</Age>
</User>
<User id="2">
<Name>Jerry</Name>
<Age>9</Age>
</User>
<User id="3">
<Name>Brooks</Name>
<Age>24</Age>
</User>
</Users>
2-1 Simple FLOWER.xq
xquery version "1.0";
for $user in doc("../XML/Users.xml")/Users/User
where $user/@id = "3"
order by $user
return $user
在User元素中,查詢屬性"id"為3的元素,并按照User降序排列,返回User,注意:XQuery是區分大小寫的。此外,在XQuery中,變量名需要加美元符"$"前綴,和PHP一樣。
查詢結果:
<User id="3"><Name>Brooks</Name><Age>24</Age></User>
2-2 Let Demo.xq
xquery version "1.0";
for $users in doc("../XML/Users.xml")/Users/User
let $name:= $users/Name
where $users/@id="3"
return $name
可以使用let語句給變量賦值,當XML中數據量很大時,使用let語句可以顯著的提高性能,因為let賦值的變量只需計算一次。
查詢結果:
<Name>Brooks</Name>
FLOWER表達式不僅僅能輸出XML文件中的元素和屬性值,還可以添加自定義的HTML元素等,達到我們想要的結果。
2-3 ul Contains.xq
xquery version "1.0";
<ul>
{
for $user in doc("../XML/Users.xml")/Users/User
where $user/@id = "3"
return $user/Name
}
</ul>
可以將XQuery語句嵌入到HTML元素中,用大括號"{}"括起來,來動態顯示需要的列表。大括號中間的內容為待計算的表達式,稱為"內嵌表達式"。
查詢結果:
<ul><Name>Brooks</Name></ul>
內嵌表達式可以出現在查詢表達式的任何位置:
2-4 Embedded AnyWhere.xq
xquery version "1.0";
<ul>
{
for $user in doc("../XML/Users.xml")/Users/User
where $user/@id = "3"
return <li>{$user/Name}</li>
}
</ul>
如上所示,在return 中包含了嵌入表達式。
查詢結果:
<ul><li><Name>Brooks</Name></li></ul>
XQuery提供了一百多個內置函數以供調用,先看幾個常用的:
2-5 Using Data().xq
xquery version "1.0";
for $user in doc("../XML/Users.xml")/Users/User
where data($user/Name) = "Brooks"
return $user
data()函數用于獲取指定元素的值。
查詢結果:
<User id="3"><Name>Brooks</Name><Age>24</Age></User>
2-6 Count() Demo.xq
xquery version "1.0";
<h3>
There are {count(doc("../XML/Users.xml")/Users/User)} Users.
</h3>
count()函數用來計算指定元素的數目,注意要將函數用大括號括起來。
查詢結果:
<h3>
There are 3 Users.
</h3>
可以使用類XML的語法為元素添加自定義屬性:
2-7 Add Customer Attribute.xq
xquery version "1.0";
<ul type = "age">
{
for $user in doc("../XML/Users.xml")/Users/User
where $user/@id = "3"
return <li class = "{$user/Name}">{data($user/Age)}</li>
(:return <li class = "{data($user/Name)}">{data($user/Age)}</li>:)
}
</ul>
注意:這里<ul>的type = "age"和<li>的class均是自定義屬性,XML本質上是自描述的,不要與HTML的屬性相混淆。
XQuery中的注釋是 (: :),而不是XML的<!-- -->,像笑臉一樣:)
查詢結果:
<ul type="age"><li class="Brooks">24</li></ul>
注意到<li class = "{$user/Name}">中的class屬性中并沒有用data()函數,卻也獲得了嵌入表達式的值,因為這是XQuery解析引擎自動完成的。
最后來看看對Altova XMLSpy 2010 Enterprise Edition的一些配置:
1、設置XML格式化
代碼的格式化對于提高代碼的可讀性與可維護性非常的重要,成熟的IDE會設置一些快捷鍵以方便開發人員快速格式化代碼,提高開發效率。如Visual Studio的Ctrl + K,D Ctrl + K,F,Eclipse 的Ctrl + Shift + F等。現在我們編寫的是XML和XQuery,該怎樣格式化呢?我查了下XMLSpy的幫助文檔,找到了一種方法,特與大家分享:
1)點擊【Tools】à 【Options】,彈出【Options】對話框:
2)在【View】選項卡中選擇【User Identation】,點擊【OK】:
選擇【User Identation】可以使得代碼自動縮進。
3)點擊工具欄上的【View】à 【Text View Settings】:
4)在【Tabs】組中,選擇"Insert Tabs"或"Insert Spaces",可以將Tab Size設置大些,點擊【OK】:
5)好了,現在我們來測試一下,首先找一個格式混亂的XML文件,還是用Users.xml,將其格式打亂:
6)點擊工具欄上的【Edit】à【Pretty-Print XML Text】,我們會發現Users.xml被自動格式化了:

2、設置常用快捷鍵
我喜歡將一些常用的操作設置為快捷鍵,方便開發與調試,這次學習XQuery也不例外。接觸XMLSpy時間不長,對這個IDE還不太熟悉,只好慢慢摸索了,除了其自帶的快捷鍵外,我新添加了兩個:自動格式化和全部保存。
上面的自動格式化默認是沒有快捷鍵的,調試時每次都要點一下,非常的麻煩,于是我就設置了一下:
點擊工具欄上的【Tools】à【Customize】:
在Keyboard選項卡中,Category選擇【Edit】,Commands選擇【Pretty-Print XML Text】,在【Press New Shortcut Key】中依次點擊"Ctrl Shift F",然后點擊"Assign",最后點擊【Close】。
這樣就將自動格式化的快捷鍵設置為了:Ctrl + Shaft + F,可以在【Edit】à【Pretty-Print XML Text】中看到我們剛才設置的快捷鍵了,以后就可以方便的進行格式化:
以同樣的方法,我設置了全部保存的快捷鍵:Ctrl + Shift + S。當然,你可以使用任意的快捷鍵,根據個人喜好,這兩個我覺得挺常用,推薦一下。
小結:
本次我們開始使用FLOWER表達式來對XML中的數據進行篩選,計算等,FLOWER可以非常的復雜,以后將會繼續深入介紹。此外7個實例也充分展示了FLOWER的靈活性,位置不固定,可以嵌入到表達式的任何部分。我們還可以添加自定義的元素和屬性,并隨意進行組合來達到顯示效。最后,對開發環境進行了一些定制,工欲善其事,必先利其器,熟練使用功能強大的IDE會使得開發與調試受益無窮。
下一次將討論多個XML文件間數據的交互與查詢,同時回到定義,探究XML元素、屬性的基本知識。

浙公網安備 33010602011771號