本文主要是介绍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
orxdt: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)
这篇关于XQuery表达式之序列类型表达式(Expressions on SequenceTypes)的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!