XQuery表達式之序列類型表達式(Expressions on SequenceTypes)

談到類型,我們就想到Schema。XQuery是一種強類型的查詢語言,它包括了對於類型的運算。然而目前帶有Schema意義的XQuery引擎還不多,比較有名的就是Saxon的商業版本(Saxon的open source版則沒有)

XQuery中提供的關於序列類型的表達式有5種:
1.instance of
instance of用於判斷第一個操作數是否是某種類型,等同於Java種的instanceof。
例:
 5 instance of xs:integer  返回true
 
5 instance of xs:decimal  返回true,因爲xs:integer相當於xs:decimal的子類型
 
<a>{5}</a> instance of xs:integer 返回false,<a>{5}</a> 是一個element,不是integer
 (5, 6) instance of xs:integer+   返回true
  . instance of element() 如果當前項是element則返回true,如果當前項不是element則返回false,如果當前項沒有定義則拋錯

2.
typeswitch
用於簡化多個if和 instance of,用於在不同類型下采用不同的處理方式,類似於Java中的switch。
例:
typeswitch($customer/billing-address)
case $a as element(*, USAddress) return $a/state
case $a as element(*, CanadaAddress) return $a/province
case $a as element(*, JapanAddress) return $a/prefecture
default return "unknown"

3。cast
cast用於將某一個值強制轉換成另外一種類型的值。cast有兩個操作數,一個是輸入表達式,另外一個是目標類型。
目標類型規定爲原子數據類型,或者在類型後面加?,用於支持空序列,但不允許是
xs:NOTATION or xdt:anyAtomicType
如果輸入表達式的類型和目標類型不兼容,則拋錯。cast的處理過程如下:
a,原子化輸入表達式(所謂原子化就是對表達式調用data函數)
b,如果原子化後的結果是產生不止一個的原子類型值,拋錯
c,如果原子化後是一個空序列,並且目標類型有?,那麼結果爲空序列,反之拋錯。
d,如果原子化後是一個原子類型值,則基於目標類型創建一個新的值。
4。castable as
castable用於判斷某個能否把某個操作數cast能另外一種類型,既上文提到的是否兼容。例:
if ($x castable as hatsize)
then $x cast as hatsize
else if ($x castable as IQ)
then $x cast as IQ
else $x cast as xs:string
5.treat as
有點類似於cast,但是不同的是它不改變輸入表達式的動態類型。只是改變它的靜態類型。
$myaddress treat as element(*, USAddress)


發佈了63 篇原創文章 · 獲贊 24 · 訪問量 23萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章