1、 What is XQuery?l XQuery is the language for querying XML data l XQuery for XML is like SQL for databases l XQuery is built on XPath expressions l XQuery is defined by the W3C l XQuery is supported by all the major database engines(IBM,Oracle,Microsoft,etc.)l XQuery will become a W3C standard-and de
2、velopers can be sure that the code will work among different products Why XQueryl XML的發展趨勢使愈來愈多的資料以XML為標準格式,如何從”資料資料”轉變成有價值的”資訊資訊”是另一波XML發展的重點。要對資料作有效的管理需透過資料庫管理系統的應用,但由於 XML的資料格式和傳統資料不同,不再適用傳統的資料庫及查詢語法,因此W3C依據XML的特性發展出XML的查詢語言,以方便對XML資料的管理及處理。l XPath的不足-XPath是專門針對XML文件中定址(addressing)使用的語言,也就是用於找出XM
3、L文件中的資料元素,其當初設計目的是為了供XSLT、XLink 及XPointer使用。Examples of UsesXQuery can be used to:Extract information to use in a Web ServiceGenerate summary reportsTransform XML data to XHTMLSearch Web documents for relevant information XQuery History l 1998年,W3C 公佈 XML1.0 版規格 l 1998年十二月,W3C 成立 Query Language Work
4、shop l 1999年九月,W3C 成立 XML Query Working Groupl 1999年十一月,XPath1.0 成為 W3C 的標準 l 2001年六月,W3C釋出 XQuery 1.0 草案規格(working draft)l 2001年十二月,XQuery 1.0 規格第二版 l 2002年十一月,W3C 釋出最新版 XQuery 1.0 以及 XPath 2.0 相關文件 l 2007年一月,成為W3C Recommendationl 2010年12月,XQuery 1.0 XQuery的基本語法l XQuery並不是使用並不是使用XMLXML語法語法,XQuery程式
5、是一個巢狀的運算式集合。l XQuery是由Path ExpressionsPath Expressions、FLWORFLWOR運算式運算式、條件運算條件運算式式和 XQueryXQuery函數函數所組成。l XQuery is case-sensitive.l XQuery elements,attributes,and variables must be valid XML names.l An XQuery string value can be in single or double quotes.l An XQuery variable is defined with a$foll
6、owed by a name,e.g.$bookstore.l XQuery comments are delimited by(:and:),e.g.(:XQuery Comment:).How to Select Nodes From books.xml?l XQuery uses functions to extract data from XML documents.l The doc()function is used to open the books.xml file:doc(books.xml)l Books.xml contains the following child e
7、lements within the“book”element:Books.xml(1/2)Everyday Italian Giada De Laurentiis 2005 30.00 Harry Potter J K.Rowling 2005 29.99 Books.xml(2/2)XQuery Kick Start James McGovern Per Bothner Kurt Cagle James Linn Vaidyanathan Nagarajan 2003 49.99 Learning XML Erik T.Ray 2003 39.95 Path Expressions l X
8、Query uses path expressions to navigate through elements in an XML document.l The following path expression is used to select all the title elements in the books.xml file:l doc(books.xml)/bookstore/book/title (/bookstore selects the bookstore element,/book selects all the book elements under the boo
9、kstore element,and/title selects all the title elements under each book element)l The above XQuery will extract the following titles:Everyday Italian Harry Potter XQuery Kick Start Learning XML Use of Predicatesl XQuery uses predicates to limit the extracted data from XML documents.lThe following pr
10、edicate is used to select all the book elements under the bookstore element that have a price element with a value that is less than 30.doc(books.xml)/bookstore/bookprice30The XQuery above will extract the following:Harry Potter J K.Rowling 2005 29.99 XQuery FLWOR Expressions l FLWOR is an acronym f
11、or For,Let,Where,Order by,Return.As in for$x in doc(books.xml)/bookstore/book where$x/price30 return$x/titlel The for clause selects all book elements under the bookstore element into a variable called$x.l The where clause selects only book elements with a price element with a value greater than 30.
12、l The order by clause defines the sort-order.Will be sorted by the title element.l The return clause specifies what should be returned.Here it returns the title elements.Another Examplel doc(books.xml)/bookstore/bookprice30/title l The following FLWOR expression will select exactly the same as the p
13、ath expression above:l for$x in doc(books.xml)/bookstore/book where$x/price30 return$x/titlel The results will be:XQuery Kick Start Learning XML An XQuery Example(1/2)l 根元素:第29列的items是查詢結果XML文件的根元素,在本例執行XQuery查詢結果的根元素都是items,如下所示:02:03:04:for$book in doc(bookstore.xml)/bookstore/book05:where$book/pr
14、ice 60006:order by$book/title07:return$book/title08:09:l 第38列的大括號之間才是真正的XQuery程式碼。An XQuery Example(2/2)lFLWOR運算式:第47列是XQuery的FLWOR運算式,類似SQL語言Select/Where 指令,屬於XQuery程式執行查詢功能的程式區塊,如下所示:04:for$book in doc(bookstore.xml“)/bookstore/book05:where$book/price 60006:order by$book/title07:return$book/title
15、XQuery Data ModellXQuery資料模型(Data Model)和XPath 2.0相同,都是將XML文件視為一棵邏輯上的樹狀結構,將XML文件視為各種不同節點的集合。lXQuery資料模型是節點(Nodes)、原子值(Atomic Values)和項目(Items)組成的類別架構。FLWOR Expressions(1/4)l 原始文件:TCP/IP IllustratedStevensAddison-WesleyAdvanced Unix ProgrammingStevensAddison-WesleyData on the WebAbiteboulBunemanSuciu
16、 FLWOR Expressions(2/4)l XQuery:for$books in doc(bib.xml)/booksfor$a in distinct-values($books/author)order by$areturn$a/text()for$b in$books/bookauthor=$aorder by$b/titlereturn$b/title FLWOR Expressions(3/4)l 結果(to be continued):AbiteboulData on the WebBunemanData on the Web FLWOR Expressions(4/4)l
17、 結果(續):StevensTCP/IP IllustratedAdvanced Unix ProgrammingSuciuData on the Web XQuery Syntax Rules(1/5)lXQuery語言並不是使用XML語法,其基本語法規則,如下所示:XQuey語言區分英文字母大小寫,Items、items和ITEMS是不同的名稱,通常是使用小寫英文字母。XQuery程式碼的元素、屬性、函數和變數名稱必須是合法的XML名稱,可以加上名稱空間的字首。XQuery Synatex Data Type(2/5)lXQuery的基本資料型態和XML Schema內建資料型態相同,如下
18、所示:布林(Boolean)資料型態:布林值true或false。數字(Number)資料型態:包含整數和浮點數值。字串(Strings)資料型態:使用單引號或雙引號括起的字元集合。日期時間資料型態:代表日期、時間和期間。XML相關的資料型態:例如:QName等資料型態。XQuery Syntax Variables and Literals(3/5)l 在XQuery程式碼使用的變數並不需事先宣告,變數是以$符號開始的合法XML名稱。例如:XQuery變數範例如下:$x、$y、$name、$bookl XQuery的文字值(Literal Values)主要分為三種型態,如下所示:字串(St
19、rings):XQuery的字串可以使用單引號或雙引號括起的字元集合。例如:P679。數字(Numbers):XQuery的數字可以是整數或浮點數。例如:1、2、34.5。建構型態:使用函數建構的特殊型態。例如:日期xs:date(2006-12-31)。XQuery Syntax Comparators(4/5)lXQuery 1.0和XPath 2.0使用相同的運算子,XQuery的比較運算子分為兩種,如下所示:一般比較(General Comparisons):一般比較運算子有=、!=、=,可以用來比較多個項目。值比較(Value Comparisons):值比較運算子有eq、ne、lt
20、、le、gt、ge,和一般比較的差異在於它是比較單獨值,也就是說,運算元一定是原子值(Atomic Value),或包含原子值的節點。XQuery Syntax Comments(5/5)l在XQuery程式碼可以使用XQuery的註解文字,這是(:開頭到:)之間的字串,如下所示:(:程式範例:Ch7-2-1.xq:)l註解文字不可以出現在查詢結果的XML文件之中。因為XQuery查詢結果是一份XML文件或XHTML文件,所以也可以使用XML文件的註解,如下所示:let and return clause let clauselFLWOR運算式的letlet子句可以指定XQuery變數的值,r
21、eturn子句傳回查詢結果。lFLWOR運算式let子句指定XQuery變數的值可以是項目或循序,如下所示:let$book:=doc(bookstore.xml)/book1let$book:=doc(bookstore.xml)/book1let$title:=Java 2let$title:=Java 2程式設計範例教本程式設計範例教本 let$list:=(1 to 5)let$list:=(1 to 5)let$price:=650let$price:=650 let and return clause return(1/4)lFLWOR運算式returnreturn子句可以輸出查詢
22、結果,如果是路徑運算式,就是輸出選取的節點內容,如下所示:let$book:=doc(bookstore.xml)/book1let$book:=doc(bookstore.xml)/book1return$book/codereturn$book/code$book變數是第1個book元素節點,return子句傳回book元素的code屬性節點。let and return clause return(2/4)l如果輸出的XQuery變數是文字值,我們可以在return子句加上標籤來建立元素節點,如下所示:let$title:=Java 2let$title:=Java 2程式設計範例教本程
23、式設計範例教本 return$titlereturn$title$title變數值是字串,大括號括起變數$title,表示取出變數內容,再加上標籤就可以建立title元素節點,如下所示:Java 2Java 2程式設計範例教本程式設計範例教本 let and return clause return(3/4)l變數值如果是循序,例如:使用return子句輸出變數$list,如下所示:let$list:=(1 to 5)let$list:=(1 to 5)return$listreturn$listreturn子句只會輸出1個num元素,如下所示:1 2 3 4 51 2 3 4 5 let a
24、nd return clause return(4/4)lreturn子句還可以合併多個運算式成為一個循序,然後輸出循序的內容,如下所示:let$price:=650let$price:=650return($price,return($price,$price$price*0.8)0.8)(和)括起的是一個循序,輸出的內容包含兩個元素listprice 和 price,price元素值是變數$price的八折。for clause basic for clause(1/6)l 基本forfor子句是以迴圈方式一一取出循序的項目,通常我們是使用路徑運算式來取出循序。例如:取出bookstore
25、.xml文件的所有price元素節點,如下所示:for$price in doc(bookstore.xml)/book/pricefor$price in doc(bookstore.xml)/book/pricereturn$pricereturn$price運算式在in指令後是路徑運算式,取得所有price元素節點的循序,在in指令前是變數$price,指定成每執行一次迴圈所取得的項目,return子句可以傳回變數內容,也就是每一個price元素。for clause counting expression(2/6)l在for子句可以加上 at at 指令的計數變數,以便計算迴圈總共執行
26、幾次。例如:在bookstore.xml文件取得所有book元素節點,並且傳回每一個節點的計數,如下所示:for$book at$i in doc(bookstore.xml)for$book at$i in doc(bookstore.xml)/book/bookreturn($i,$book/title)return($i,$book/title)運算式每執行一次,變數$i就加1,return子句傳回的num元素就是變數$i的值。for clause range expression(3/6)lFLWOR運算式的for子句可以如同程式語言的迴圈敘述建立範圍運算式。例如:執行13範圍的for
27、子句,如下所示:for$i in(1 to 3)for$i in(1 to 3)return$ireturn$i運算式在in指令後的是自定循序,即13,換句話說,變數$i的值就是13,所以return子句傳回的就是3個count元素,其值也是13。for clause multiple for (4/6)lFLWOR運算式允許同時使用多個for子句,每個子句使用,符號分隔,例如:兩個for子句的範圍運算式,如下所示:for$x in(1,2),$y in(5,6)for$x in(1,2),$y in(5,6)return x=$x y=$yreturn x=$x y=$y運算式一共有2個範圍
28、運算式,類似巢狀迴圈,可以建立4個eval元素。for clause Results in HTML list(5/6)l for$x in doc(books.xml)/bookstore/book/titleorder by$xreturn$x Output:Everyday ItalianHarry PotterLearning XMLXQuery Kick Startfor clause Results in HTML list(6/6)l for$x in doc(books.xml)/bookstore/book/titleorder by$xreturn data($x)Outp
29、ut:Everyday ItalianHarry PotterLearning XMLXQuery Kick Start where clause single condition(1/2)l單一條件的where子句只有一個條件運算式,例如:過濾price元素值需要大於600,如下所示:for$price in doc(bookstore.xml)for$price in doc(bookstore.xml)/book/price/book/pricewhere$price 600where$price 600return$pricereturn$pricewhere子句只有當$price 6
30、00值為true時,才會輸出return子句的元素。where clause multiple conditions(2/2)l 在where子句可以使用and和or運算式建立包含多個子條件的運算式,如下所示:for$book at$i in doc(bookstore.xml“)/bookwhere starts-with($book/title,P)and$book/price=600return($i,$book/title)where子句使用and連接兩個條件運算式,第1個是XQuery函數starts-with()檢查書名是否是P開頭,第2個運算式過濾price元素大於等於600。o
31、rder by clausel在FLWOR運算式的order by子句,可以指定輸出結果的排序方式。例如:指定輸出結果使用book的title子元素值進行排序,如下所示:for$book in doc(bookstore.xml)/bookorder by$book/titlereturn$book/title運算式的order by子句指定使用title元素進行排序。Distinct Outputl 在FLWOR運算式的for子句,可以使用XQuery函數distinct-values()指定輸出結果沒有重複值。例如:bookstore.xml文件的price元素擁有重複值,我們可以使用函數
32、來輸出沒有重複值的結果,如下所示:let$books:=doc(bookstore.xml)/bookfor$p in distinct-values($books/price)return$pfor子句使用distinct-values()函數顯示沒有重複的值,也就是刪除重複的price元素值。Conditional OperationslXQuery語言也支援if/then/else條件運算式,如果if的條件為true,就執行then之後的運算式,否則執行else之後的運算式,如下所示:for$book in doc(bookstore.xml)/bookreturn if($book/c
33、ode=P697)then data($book/title)else$book/title Create a New Elementl在XQuery路徑運算式雖然只能輸出查詢結果的XML元素與屬性,不過,FLWOR運算式的return子句,就可以新增XML或XHTML元素,如下所示:return data($book/title)return子句新增XHTML的標籤,使用data()函數取出title元素內容來新增XHTML元素。Creating a New AttributelFLWOR運算式的return子句可以新增XML或XHTML元素的屬性,如下所示:return data($boo
34、k/title)return子句不只新增XHTML的標籤,還新增class屬性,其值是XML元素book的code屬性值。Join Operation using Predicatesl 在FLWOR運算式可以使用多重for子句,配合return 來執行合併查詢。例如:在Order.xml查詢dept屬性為CS的訂單項目,並且使用合併查詢來查詢該項目在Bookstore.xml的書名,如下所示:let$order:=doc(Order.xml)let$bookstore:=doc(Bookstore.xml)for$item in$order/itemdept=CS,$book in$book
35、store/bookcode=$item/code return data($book/title)data($item/quantity)Join Operation using where clausel 在FLWOR運算式也可以使用多重for子句,配合where子句來執行合併查詢。在Order.xml查詢dept屬性為CS的訂單項目,並且使用合併查詢來查詢該項目在Bookstore.xml的書名,如下所示:let$order:=doc(Order.xml)let$bookstore:=doc(Bookstore.xml)for$item in$order/itemdept=CS,$boo
36、k in$bookstore/book where$item/code=$book/code return External Join Operationl外部合併查詢是查詢第一份XML文件的全部項目,但是在第二份XML文件只取出存在的元素。在XQuery程式是使用兩個FLWOR運算式來執行外部合併查詢。External Join Operation Examplel 例如:顯示Bookstore.xml所有圖書資料,但是只顯示Discount.xml文件中擁有折扣元素的書價,如下所示:let$discount:=doc(Discount.xml)for$book in doc(Booksto
37、re.xml)/bookreturn for$price in$discount/book where$book/code=$price/code return$book/price*$price/discount Groupingl 群組(Grouping)可以將資料進行分類,分類方式是將來源XML文件的元素或屬性值中,重複值結合起來歸成一類。例如:在Order.xml文件訂單項目的item元素是使用dept屬性來分類,以便區分學校中屬於不同科系的訂單項目,如下所示:for$dept in distinct-values($order/item/dept)let$item:=$order/i
38、temdept=$dept return$item Aggregate Functions(1/2)l 聚合函數可以執行群組元素或屬性資料的計算,以便提供進一步的資料分析。例如:筆數、總和、平均、最大和最小值等。在XQuery常用的聚合函數說明,如下表所示:聚合函數聚合函數說明說明count()計算筆數sum()計算總和avg()計算平均值max()取得最大值min()取得最小值 Aggregate Functions(2/2)l 例如:繼續群組查詢,我們可以使用count()和sum()聚合函數顯示每一群組的計數和訂單總量,如下所示:for$dept in distinct-values($
39、order/item/dept)let$item:=$order/itemdept=$dept return count(distinct-values($item/code)sum($item/quantity)XQuery Self-defined Functionsl XQuery自訂函數是以declare function關鍵字進行宣告,函數名稱擁有名稱空間字首。例如:minPrice()函數的宣告,如下所示:declare function local:minPrice($price as xs:integer?,$discount as xs:decimal?)as xs:deci
40、mal?let$minprice:=$price*$discountreturn$minprice;XQuery Function Invocationsl在XQuery程式呼叫自訂函數時,函數名稱需要包含字首。例如:呼叫自訂函數local:minPrice(),如下所示:return local:minPrice($book/price,$price/discount)XQuery Bulit-in FunctionslXQuery、XPath與XSLT擁有共用的內建函數,XPath的函數也一樣可以在XQuery程式使用。l在XQuery程式呼叫XQuery內建函數的方法時,並不需要加上名稱空間的字首。在元素元素呼叫XQuery函數在路徑運算式路徑運算式呼叫XQuery函數在FLWORFLWOR運算式運算式呼叫XQuery函數