W3Cschool
恭喜您成為首批注冊用戶
獲得88經(jīng)驗值獎勵
ISO/IEC 9075-14中與XML相關(guān)的規(guī)范進行了重大修訂 (SQL/XML)與SQL:2006一起被引入. PostgreSQL's 的XML數(shù)據(jù)類型和相關(guān)函數(shù)的實現(xiàn)基本上沿用了2003年的早期版本。有一些借鑒了后來的版本。 特別是:
現(xiàn)行標(biāo)準(zhǔn)提供了一系列可擴展標(biāo)記語言數(shù)據(jù)類型,其中將“文檔”或“內(nèi)容”保存在非類型或XML Schema類型的變體,以及類型XML(SEQUENCE)
用于保存任意的XML內(nèi)容片段。 PostgreSQL提供了一個單一的
xml
類型,可以容納“文檔”或“內(nèi)容”。 沒有相應(yīng)的標(biāo)準(zhǔn)的“序列”類型。
PostgreSQL提供了兩個函數(shù)在SQL:2006中引入的,但是在變體中,使用的是XPath 1.0語言,而不是在標(biāo)準(zhǔn)中為其指定的XML查詢。
本節(jié)介紹了一些你可能會遇到的差異。
PostgreSQL-指定的函數(shù) xpath()
和 xpath_exists()
使用XPath語言查詢XML文檔。 PostgreSQL也提供了標(biāo)準(zhǔn)函數(shù)中的XPath-only變體XMLEXISTS
和
XMLTABLE
, 其中正式采用XQuery語言。所有這些函數(shù) PostgreSQL都依賴于libxml2 庫,而這個庫僅在XPath 1.0中提供。
在XQuery語言和XPath 2.0及以后的版本之間有很強的聯(lián)系:任何語法上有效的表達式,在這兩個版本中都能成功地執(zhí)行,都會產(chǎn)生相同的結(jié)果(對于包含數(shù)字字符引用或預(yù)定義的實體引用的表達式會略有不同, XQuery會用相應(yīng)的字符替換,而 XPath則不會。) 但這些語言和XPath 1.0之間沒有這種聯(lián)系,它是一種較早的語言,在很多方面都有區(qū)別。
有兩類限制需要記住:一是對SQL標(biāo)準(zhǔn)中指定的函數(shù)從XQuery到XPath的限制,二是對標(biāo)準(zhǔn)和PostgreSQL特定函數(shù)XPath的限制是1.0版本 。
除了XPath的特性之外,XQuery的特性還包括:
除了所有可能的XPath值之外,XQuery表達式還可以構(gòu)造和返回新的XML節(jié)點。 XPath 可以創(chuàng)建和返回原子類型(數(shù)字、字符串等)的值,但只能返回作為表達式輸入的文檔中已經(jīng)存在的XML節(jié)點。
XQuery有用于迭代、排序和分組的控制結(jié)構(gòu)。
XQuery允許聲明和使用局部函數(shù)。
最近的 XPath 版本開始提供與這些功能重疊的功能(例如函數(shù)式的 for-each
和sort
,匿名函數(shù),以及 parse-xml
從字符串中創(chuàng)建節(jié)點的parse-xml
),但這些功能在 XPath 3.0 之前是不具備的。
對于熟悉XQuery和XPath 2.0或更高版本的開發(fā)人員來說,XPath 1.0帶來了許多不同的地方,需要解決的是:
一個XQuery/XPath表達式的基本類型,即 sequence
,它可以包含XML節(jié)點、原子值或兩者,在XPath 1.0中不存在。一個1.0表達式只能產(chǎn)生一個節(jié)點集(包含0個或更多的XML節(jié)點),或者一個原子值。
與XQuery/XPath序列不同的是,XPath 1.0節(jié)點集沒有保證順序,和任何集一樣,不允許同一個項目多次出現(xiàn)。
libxml2庫似乎總是將節(jié)點集返回到PostgreSQL的節(jié)點集,其成員在輸入文檔中的相對順序是一樣的。 它的文檔并沒有承諾這種行為,而且XPath 1.0表達式不能控制它。
雖然XQuery/XPath提供了XML Schema中定義的所有類型和許多操作符和函數(shù),但XPath 1.0只有節(jié)點集和三種原子類型boolean
、double
和string
。
XPath 1.0沒有條件運算符。一個XQuery/XPath表達式,如if ( hat ) then hat/@size else "no hat"
沒有XPath 1.0的等價物。
XPath 1.0沒有對字符串進行排序比較運算符。"cat" < "dog"
和"cat" > "dog"
都是假的,因為每一個都是兩個NaN
的數(shù)值比較。相比之下,=
和!!=
確實將字符串作為字符串進行比較。
XPath 1.0模糊了XQuery/XPath定義的值比較和一般比較之間的區(qū)別。 sale/@hatsize = 7
和sale/@customer = "alice"
都是存在的量化比較,如果有任何sale
屬性的給定值,則為真。但
sale/@taxable = false()
是與整個節(jié)點集的有效布爾值的值比較。只有當(dāng)沒有sale
有一個taxable
屬性時,它才是真值。
在XQuery/XPath數(shù)據(jù)模型中,一個文檔節(jié)點既可以有文檔形式(即正好有一個頂層元素,只有注釋和處理指令以外的注釋和處理指令),也可以有內(nèi)容形式(放寬了這些限制)。在XPath 1.0中,它的等價物是根節(jié)點,只能是文檔形式。這也是xml
的值被作為 上下文項到任何 PostgreSQL的上下文項
基于XPath的函數(shù)必須是以文檔形式出現(xiàn)。
這里強調(diào)的區(qū)別并不是全部。在XQuery和XPath的2.0及以后的版本中,有一個XPath 1.0的兼容性模式,W3C列出的 函數(shù)庫變化和語言變化在該模式下應(yīng)用的列表提供了一個更完整(但仍然不是詳盡的)的差異說明。 兼容性模式不能使后來的語言與XPath 1.0完全等同。
在SQL:2006及以后的版本中,標(biāo)準(zhǔn)SQL數(shù)據(jù)類型和XML Schema類型之間的轉(zhuǎn)換方向都被精確地指定了。但是,這些規(guī)則都是用XQuery/XPath的類型和語義來表示的,對于XPath 1.0的不同數(shù)據(jù)模型沒有直接應(yīng)用。
當(dāng)PostgreSQL將SQL數(shù)據(jù)值映射到XML(如xmlelement
),或XML映射到SQL(如輸出 xmltable
的列),除了少數(shù)情況下的 特殊處理,PostgreSQL只需假定 XML 數(shù)據(jù)類型的 XPath 1.0 字符串形式將被視為有效的文本輸入形式的SQL數(shù)據(jù)類型,反之。
該規(guī)則的優(yōu)點是簡單,同時對許多數(shù)據(jù)類型來說,產(chǎn)生的結(jié)果與標(biāo)準(zhǔn)中規(guī)定的映射類似。
如果與其他系統(tǒng)的互操作性是一個問題,對于某些數(shù)據(jù)類型,可能需要使用數(shù)據(jù)類型格式化函數(shù)(如第 9.8 節(jié)中的函數(shù))來生成標(biāo)準(zhǔn)映射。
本節(jié)涉及的限制并不是libxml2庫所固有的,而是適用于PostgreSQL中的當(dāng)前實現(xiàn)。
by VALUE
傳遞機制SQL標(biāo)準(zhǔn)定義了兩種傳遞機制,適用于從SQL向XML函數(shù)傳遞XML參數(shù)或接收結(jié)果時。BY REF
,其中一個特定的XML 值保留其節(jié)點身份,以及BY VALUE
,其中傳遞XML的內(nèi)容,但不保留節(jié)點身份。可以在參數(shù)列表之前指定,作為所有參數(shù)的默認(rèn)機制,也可以在任何參數(shù)之后指定,以覆蓋默認(rèn)機制。
為了說明區(qū)別,如果x
是一個XML值,那么在SQL:2006環(huán)境下的這兩個查詢將分別產(chǎn)生true和false。
SELECT XMLQUERY('$a is $b' PASSING BY REF x
AS a, x
AS b NULL ON EMPTY);
SELECT XMLQUERY('$a is $b' PASSING BY VALUE x
AS a, x
AS b NULL ON EMPTY);
PostgreSQL將在XMLEXISTS
或XMLTABLE
構(gòu)造中接受BY VALUE
或BY REF
,但它會忽略它們。 xml
數(shù)據(jù)類型持有一個字符串的序列化表示,因此沒有節(jié)點標(biāo)識需要保留,并且傳遞總是有效的
BY VALUE
。
基于 XPath 的函數(shù)支持傳遞一個參數(shù)作為 XPath 表達式的上下文項,但不支持傳遞額外的值作為命名參數(shù)提供給表達式。
XML(SEQUENCE)
類型 PostgreSQL xml
數(shù)據(jù)類型只能保存一個值,在DOCUMENT
或 CONTENT
形式。 一個XQuery/XPath表達式上下文項必須是一個單一的XML節(jié)點或原子值,但XPath 1.0進一步限制它只能是一個XML節(jié)點,并且沒有允許CONTENT
的節(jié)點類型。
最終的結(jié)果是,一個完善的 DOCUMENT
是 PostgreSQL可以作為XPath上下文項提供的唯一形式的XML值。
Copyright©2021 w3cschool編程獅|閩ICP備15016281號-3|閩公網(wǎng)安備35020302033924號
違法和不良信息舉報電話:173-0602-2364|舉報郵箱:jubao@eeedong.com
掃描二維碼
下載編程獅App
編程獅公眾號
聯(lián)系方式:
更多建議: