本專(zhuān)欄文章介紹了 xml Query(也稱(chēng)為 XQuery)工作草案的當(dāng)前狀態(tài)。Kevin Williams 演示了如何使用 FLWR(“flower”)子句,介紹了 distinct-values 函數(shù)(該函數(shù)被使用于透視數(shù)據(jù)關(guān)系)并就 XQuery 將如何影響數(shù)據(jù)文檔操作給出了他的評(píng)價(jià)。XQuery 和 XML 的樣本代碼演示了 for、let、where 和 return(FLWR)子句的用法。 假如您曾經(jīng)嘗試過(guò)使用 XSL 進(jìn)行任何形式的復(fù)雜數(shù)據(jù)操作(例如連接兩個(gè)元素集、透視關(guān)系或者甚至相對(duì)簡(jiǎn)單的數(shù)學(xué)計(jì)算),那么您就知道它在數(shù)據(jù)操作的特性方面稍微欠缺了一點(diǎn)。要解決這個(gè)問(wèn)題,樣式表作者們不得不使用書(shū)上的每種訣竅 ? 將多個(gè)樣式表鏈接在一起、對(duì) xsl:for-each 運(yùn)算符進(jìn)行很深的嵌套以及編寫(xiě)令 Perl 專(zhuān)家都頭痛的語(yǔ)法煩瑣的代碼。不用擔(dān)心,馬上就會(huì)得到幫助。即將于 2002 年夏季發(fā)布的 XQuery 規(guī)范將解決所有這些問(wèn)題以及更多其它問(wèn)題。
那么什么是 XML Query? XML Query,通常縮寫(xiě)為 XQuery,是一種已經(jīng)以這樣或那樣的方式存在幾年的規(guī)范。XML Query 工作組在 1999 年 9 月正式成立,任務(wù)是創(chuàng)建一種靈活的查詢(xún)語(yǔ)言來(lái)從 XML 文檔中抽取數(shù)據(jù)。最新的工作草案(請(qǐng)參閱參考資料)對(duì)實(shí)現(xiàn)這個(gè)目標(biāo)大有幫助。
清單 7. 透視客戶(hù)-產(chǎn)品關(guān)系的代碼 { let $inDoc := document("customerList.xml") for $product in distinct-values("$input//customer/product/@name) return { for $customer in $input//customer where $customer/product/@name = $product return }
其次,XQuery 包含一些用來(lái)訪問(wèn)資源庫(kù)中多個(gè)文檔的機(jī)制。這個(gè)文檔函數(shù)答應(yīng)您以編程方式在同一個(gè)查詢(xún)中訪問(wèn)多個(gè)文檔。但是,相同的問(wèn)題出現(xiàn)了:您仍需要裝入并解析每個(gè)文檔。因此,要達(dá)到最佳性能,您最好還是使用 XML 數(shù)據(jù)庫(kù)或一些其它形式的索引模型。
最后,XQuery 最擅優(yōu)點(diǎn)理“混合”文檔 ? 同時(shí)包含敘述流和量化數(shù)據(jù)的文檔。例如,一個(gè)醫(yī)療記錄文檔可能包含手術(shù)期間外科醫(yī)生操作的描述,以及手術(shù)期間使用的藥物、血和其它物品的數(shù)量。該文檔不適合存儲(chǔ)在關(guān)系型數(shù)據(jù)庫(kù)中,但是,XQuery 卻非常擅長(zhǎng)此道,它能直接從該 XML 文檔中抽取出量化信息。但是,假如您的文檔是純數(shù)據(jù),那么將該文檔引入到關(guān)系型數(shù)據(jù)庫(kù)中進(jìn)行操作會(huì)更有意義。
結(jié)束語(yǔ) XQuery 為 XML 文檔中的數(shù)據(jù)操作提供了一種強(qiáng)大的語(yǔ)法。它最適合于那些同時(shí)包含敘述性文本和量化數(shù)據(jù)的文檔。在對(duì)這些類(lèi)型的文檔上使用 XQuery 時(shí),為達(dá)到最佳性能,可以將這些文檔裝入一些已建立索引的 XML 資源庫(kù)中。