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万+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章