XQuery学习笔记(二)

XQuery语言的构成

一个XQuery查询由查询序言和查询体组成:
Query ::= QueryProlog QueryBody
查询序言(Query Prologue)是一系列声明和定义,建立了查询处理的环境。主要包括命名空间声明、模式导入、xmlspace声明、缺省的collation以及函数定义。
QueryProlog ::= (NamespaceDec | XMLSpaceDecl | DefaultNamespaceDecl |DefaultCollationDecl |SchemaImport)*FunctionDefn*
查询体(Query Body)由定义了查询结果的表达式序列构成
:QueryBody ::= ExprSequence?
表达式序列则由一个个的表达式组成:
ExprSequence ::= Expr ("," Expr )*

XQuery查询处理过程

XQuery查询处理过程与一般的语言处理过程基本相同,主要包括:
(1) XML Schema导入:XQuery处理器需要建立符合输入文档模式的类型描述。在这一阶段,查询所需要的所有模式都被映射进XQuery类型系统。
(2) XML文档加载:将XML文档映射为XQuery数据模型的实例。具体过程为:使用XML解析器对输入的XML文档进行解析;对被解析的文档进行Schema验证,验证过程产生一个被称之为Post Schema Validation Infoset(PSVI)的抽象信息结构;将PSVI转换为数据模型实例。
(3) 查询表达式处理:表达式的解析、分析、优化、求值。
(4) 串行化输出:将查询结果以XML文档形式串行化输出。
其中,查询表达式处理是由查询处理器执行的一个核心过程,包括:①查询解析:根据表达式语法规则验证表达式的合法性;②标准化:将输入的合法表达式标准化为等价的XQuery核心语言表示;③静态类型分析:类似与程序语言的静态编译,检查查询类型是否符合要求等等;④动态求值:将查询运算与具体的XML文档绑定,计算查询结果。

XQuery表达式

(1) 常量和变量
常量以字面值表示,如“XML查询语言”;变量则以美元符号“$”开头,后接一个变量名,如$name。
(2) 路径表达式
路径表达式由一个或多个定位步(location step )组成,每个step包含最多3个组件:(1) 轴(axis):确定待选节点的“方向”,其后的节点测试将应用在这个轴上;(2)节点测试(node test):实际的名字或类型匹配测试;(3) 谓词(predicate):进一步的布尔值限定(可选)。
e.g.在文档“book.xml”的第2章中查找标题为“Tree Frogs”的图形。
document("book.xml")/chapter[2]// figure[caption ="Tree Frogs"]
这里,document()函数返回book.xml的文档节点,“/”表明元素节点chapter是文档节点的儿子;而“//”则表明,元素节点figure可以位于chapter节点之下的任何一层。
(3) 构造器
利用构造器可以在一个查询内创建XML结构。XQuery支持对元素、属性、CDATA节、处理指令以及注释的构造。
e.g.生成一个<emp>元素,该元素有一个“empid”属性。元素内容和属性值由绑定在其它查询中的变量指定。
<emp empid = {$ id}>
{$ name}
{$ job}
</ emp>
(4) FLWR表达式
FLWR表达式是XQuery查询语言中最重要的一个表达式,类似于SQL中的SELECT语句。其语法构成为
FLWRExpr ::= ((ForClause | LetClause)+ WhereClause? "return")*QuantifiedExpr
ForClause ::= "for" TypeDeclaration? "$" VarName "in" Expr (","TypeDeclaration? "$" VarName "in" Expr)*
LetClause ::= "let" TypeDeclaration? "$" VarName ":=" Expr (","TypeDeclaration? "$" VarName ":=" Expr)*
WhereClause ::= "where" Expr
TypeDeclaration ::= SequenceType
其中,FOR子句和LET子句生成一组被绑定到变量的表达式元组,并保持文档顺序;WHERE子句通过使用谓词过滤掉不满足谓词条件的元组;RETURN子句则对剩下的每个元组进行操作,生成一组有序的输出。
e.g.列出书目文档(bib.xml)中所有出版商以及该出版商所出书目的平均价格。
FOR $p IN distinct(document("bib.xml")//publisher)
LET $a := avg(document("bib.xml")/book[publisher = $p]/price)
RETURN
<publisher>
<name> {$p/ text()} </name>
<avgprice> {$a} </avgprice>
</publisher> 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值