XQuery学习.docx
- 文档编号:6424732
- 上传时间:2023-01-06
- 格式:DOCX
- 页数:12
- 大小:19.98KB
XQuery学习.docx
《XQuery学习.docx》由会员分享,可在线阅读,更多相关《XQuery学习.docx(12页珍藏版)》请在冰豆网上搜索。
XQuery学习
XQuery与XPath学习
1.XQuery学习
在XQuery中的七种节点:
元素、属性、文本、命名空间、处理指令、注释、以及文档(根)节点
xmlversion="1.0"encoding="ISO-8859-1"?
>(处理指令)
—XML注释--!
>(XML注释)
XQuery基本语法规则
一些基本的语法规则:
●XQuery对大小写敏感
●XQuery的元素、属性以及变量必须是合法的XML名称。
●XQuery字符串值可使用单引号或双引号。
●XQuery变量由“$”并跟随一个名称来进行定义,举例,$bookstore
●XQuery注释被(:
和:
)分割,举例,(:
XQuery注释:
)
XQuery条件表达式
"If-Then-Else"可以在XQuery中使用。
for$xindoc("books.xml")/bookstore/book
returnif($x/@category="CHILDREN")
then
else
结果
XQuery选择和过滤
FLWOR表达式:
(F-ForL-letW-whereO-OrderRreturn)
for$xindoc("books.xml")/bookstore/book
where$x/price>30
orderby$x/title
return$x/title
for
(可选)向每个由in表达式返回的项目捆绑一个变量
let
(可选)
where
(可选)设定一个条件
orderby
(可选)设定结果的排列顺序
return
规定在结果中返回的内容
for语句
for语句可将变量捆绑到由in表达式返回的每个项目。
for语句可产生迭代。
在同一个FLWOR表达式中可存在多重for语句。
如需在一个for语句中进行指定次数地循环,您可使用关键词to :
for$xin(1to5)
return
结果:
关键词at 可用于计算迭代:
for$xat$iindoc("books.xml")/bookstore/book/title
return
结果:
在for语句中同样允许多个in表达式。
请使用逗号来分割每一个in表达式:
for$xin(10,20),$yin(100,200)
return
结果:
let语句
let语句可完成变量分配,并可避免多次重复相同的表达式。
let语句不会导致迭代。
let$x:
=(1to5)
return
结果:
where语句
where语句用于为结果设定一个或多个条件(criteria)。
where$x/price>30and$x/price<100
orderby语句
orderby语句用于规定结果的排序次序。
此处,我们要根据category和title来对结果进行排序:
for$xindoc("books.xml")/bookstore/book
orderby$x/@category,$x/title
return$x/title
结果:
return语句
return语句规定要返回的内容。
for$xindoc("books.xml")/bookstore/book
return$x/title
结果:
XQuery函数
XQuery含有超过100个内建的函数
XQuery函数命名空间的URI:
http:
//www.w3.org/2005/02/xpath-functions
函数命名空间的默认前缀是fn:
。
函数调用实例
函数调用可与表达式一同使用。
请看下面的例子:
例1:
在元素中
例2:
在路径表达式的谓语中
doc("books.xml")/bookstore/book[substring(title,1,5)='Harry']
例3:
在let语句中
let$name:
=(substring($booktitle,1,4))
XQuery用户定义函数
如果找不到所需的XQuery函数,你可编写自己的函数。
可在查询中或独立的库中定义用户自定义函数。
语法
declarefunction前缀:
函数名($参数AS数据类型)
AS返回的数据类型
{
(:
...函数代码...:
)
};
关于用户自定义函数的注释:
∙请使用declarefunction关键词
∙函数名须使用前缀
∙参数的数据类型通常与在XMLSchema中定义的数据类型一致
∙函数主体须被花括号包围
一个在查询中声明的用户自定义函数的例子:
declarefunctionlocal:
minPrice(
$priceasxs:
decimal?
$discountasxs:
decimal?
)
ASxs:
decimal?
{
let$disc:
=($price*$discount)div100
return($price-$disc)
};
(:
Belowisanexampleofhowtocallthefunctionabove:
)
minPrice($book/price,$book/discount)}
XQuery函数
XQuery构建在XPath表达式之上。
XQuery1.0和XPath2.0分享相同的数据模型,并支持相同的函数和运算符。
2.XPath学习
Xpath语法
XPath使用路径表达式来选取XML文档中的节点或节点集。
节点是通过沿着路径(path)或者步(steps)来选取的。
选取节点
XPath使用路径表达式在XML文档中选取节点。
节点是通过沿着路径或者step来选取的。
列出了最有用的路径表达式:
表达式
描述
nodename
选取此节点的所有子节点
/
从根节点选取
//
从匹配选择的当前节点选择文档中的节点,而不考虑它们的位置
.
选取当前节点
..
选取当前节点的父节点
@
选取属性
实例
在下面的表格中,我们已列出了一些路径表达式以及表达式的结果:
路径表达式
结果
bookstore
选取bookstore元素的所有子节点
/bookstore
选取根元素bookstore
注释:
假如路径起始于正斜杠(/),则此路径始终代表到某元素的绝对路径!
bookstore/book
选取所有属于bookstore的子元素的book元素。
//book
选取所有book子元素,而不管它们在文档中的位置。
bookstore//book
选择所有属于bookstore元素的后代的book元素,而不管它们位于bookstore之下的什么位置。
//@lang
选取所有名为lang的属性。
谓语(Predicates)
谓语用来查找某个特定的节点或者包含某个指定的值的节点。
谓语被嵌在方括号中。
实例
在下面的表格中,我们列出了带有谓语的一些路径表达式,以及表达式的结果:
路径表达式
结果
/bookstore/book[1]
选取属于bookstore子元素的第一个book元素。
/bookstore/book[last()]
选取属于bookstore子元素的最后一个book元素。
/bookstore/book[last()-1]
选取属于bookstore子元素的倒数第二个book元素。
/bookstore/book[position()<3]
选取最前面的两个属于bookstore元素的子元素的book元素。
//title[@lang]
选取所有拥有名为lang的属性的title元素。
//title[@lang='eng']
选取所有title元素,且这些元素拥有值为eng的lang属性。
/bookstore/book[price>35.00]
选取所有bookstore元素的book元素,且其中的price元素的值须大于35.00。
/bookstore/book[price>35.00]/title
选取所有bookstore元素中的book元素的title元素,且其中的price元素的值须大于35.00。
选取未知节点
XPath通配符可用来选取未知的XML元素。
通配符
描述
*
匹配任何元素节点
@*
匹配任何属性节点
node()
匹配任何类型的节点
实例
在下面的表格中,我们列出了一些路径表达式,以及这些表达式的结果:
路径表达式
结果
/bookstore/*
选取bookstore元素的所有子节点
//*
选取文档中的所有元素
//title[@*]
选取所有带有属性的title元素。
选取若干路径
通过在路径表达式中使用“|”运算符,您可以选取若干个路径。
实例
在下面的表格中,我们列出了一些路径表达式,以及这些表达式的结果:
路径表达式
结果
//book/title|//book/price
选取所有book元素的title和price元素。
//title|//price
选取所有文档中的title和price元素。
/bookstore/book/title|//price
选取所有属于bookstore元素的book元素的title元素,以及文档中所有的price元素。
XML实例文档
我们将在下面的例子中使用此XML文档:
xmlversion="1.0"encoding="ISO-8859-1"?
>
XPath轴
轴可定义某个相对于当前节点的节点集。
轴名称
结果
ancestor
选取当前节点的所有先辈(父、祖父等)
ancestor-or-self
选取当前节点的所有先辈(父、祖父等)以及当前节点本身
attribute
选取当前节点的所有属性
child
选取当前节点的所有子元素。
descendant
选取当前节点的所有后代元素(子、孙等)。
descendant-or-self
选取当前节点的所有后代元素(子、孙等)以及当前节点本身。
following
选取文档中当前节点的结束标签之后的所有节点。
namespace
选取当前节点的所有命名空间节点
parent
选取当前节点的父节点。
preceding
选取文档中当前节点的开始标签之前的所有节点。
preceding-sibling
选取当前节点之前的所有同级节点。
self
选取当前节点。
位置路径表达式
位置路径可以是绝对的,也可以是相对的。
绝对路径起始于正斜杠(/),而相对路径不会这样。
在两种情况中,位置路径均包括一个或多个步,每个步均被斜杠分割:
绝对位置路径:
/step/step/...
相对位置路径:
step/step/...
每个步均根据当前节点集之中的节点来进行计算。
步(step)包括:
轴(axis)
定义所选节点与当前节点之间的树关系
节点测试(node-test)
识别某个轴内部的节点
零个或者更多谓语(predicate)
更深入地提炼所选的节点集
步的语法:
轴名称:
:
节点测试[谓语]
实例
例子
结果
child:
:
book
选取所有属于当前节点的子元素的book节点
attribute:
:
lang
选取当前节点的lang属性
child:
:
*
选取当前节点的所有子元素
attribute:
:
*
选取当前节点的所有属性
child:
:
text()
选取当前节点的所有文本子节点
child:
:
node()
选取当前节点的所有子节点
descendant:
:
book
选取当前节点的所有book后代
ancestor:
:
book
选择当前节点的所有book先辈
ancestor-or-self:
:
book
选取当前节点的所有book先辈以及当前节点(假如此节点是book节点的话)
child:
:
*/child:
:
price
选取当前节点的所有price孙。
XPath无疑非常强大,但也有其局限性。
最突出的是,它很大程度上只适合静态数据。
换句话说,需要针对特定文档编写XPath查询,提供和元素、属性、文本比较的具体数据来使用谓词和XPath。
此外,XPath也没有任何控制结构(如if/else语句),除了简单的比较外也不能执行任何处理。
selectT.segment_name,t.bytes/1024/1024total_sizefromuser_segmentstwheret.segment_name='EMRTEST'
3100个记录0.3125MB物理空间
OracleXMLDB相关函数
extractValue()http:
//www.adp-gmbh.ch/ora/sql/extractvalue.html
existsNode()http:
//www.adp-gmbh.ch/ora/sql/existsnode.html
XMLQuery
XMLTable
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- XQuery 学习