XPath(转)[3]

[入库:2005年8月19日] [更新:2007年3月24日]

本文简介:选择自 miki52777 的 blog

   if (empty($e/*)) then 1
   else max(for $c in $e/* return depth($c)) + 1
}
头两个部分合在一起叫做query prolog。
(3)查询表达式是模块结构中最重要的部分,例如:
<everyone> 
   for $e in document ("emp.xml")//name 
   return <who> $e </who> 
</everyone>

xquery语法与实例
每一个xquery查询包括一个或多个查询表达式。常用的xquery语法有:路径表达式(path expression),算术表达式与布尔表达式,flwr表达式,条件表达式(conditional expression),元素构造器(element constructor),以及函数调用(function call)。
路径表达式(path expression)
xquery中, 的路径表达式沿袭了xpath 2.0的语法。它们使用path标记从xml文档中选择感兴趣的节点。在这里其实是把xml文档看作是带有结点的树。路径表达式提供了从结点树中选择结点的方法。下面举一些路径表达式的例子:
? para 对上下文结点的段落(para)元素进行选择
? * 对上下文结点的所有元素进行选择
? text() 对上下文结点的所有文本结点进行选择
? @name 对上下文结点的name属性进行选择
? @* 对上下文结点的所有属性进行选择
? para[1] 对上下文结点的第一个para元素结点进行选择
? para[last()]对上下文结点的最后一个para元素结点进行选择
? */para对上下文结点作为孙子结点的para元素进行选择
? /doc/chapter[5]/section[2]选择doc的第五章节的第二部分
? chapter//para 对上下文结点的孩子结点chapter的孙子结点para元素进行选择
? //para 对所有的文档根结点的孙子结点para以及对做为上下文结点的同一个文档中的para元素进行选择
? //olist/:项在同样的文档中选择所有的项元素作为具有olist双亲结点的上下文结点
? . 选择上下文结点
? .//para 选择作为上下文结点的孙子结点的para元素
? .. 对上下文结点的双亲结点进行选择
? ../@lang 对上下文结点的双亲结点的lang属性 进行选择
? para[@type="warning"] 对所有的具有一个type属性值为warning的作为上下文结点孩子结点的para元素
? chapter[title="introduction"]选择具有title名为introduction的chapter. 
? chapter[title] 选择出具有一个或多个title的chapter
? employee[@secretary and @assistant] 选择作为上下文结点的孩子结点的所有同时具有secretary属性和assistant属性的 employee。
? book/(chapter|appendix)/section选择book中双亲结点是chapter或者appendix的部分。
? book/xf:id(publisher)/name 与xf:id(book/publisher)/name返回同样的结果。

算术表达式与布尔表达式(arithmetic and boolean expressions): 
这可以算是最简单的一部分了,规则与语法几乎同很多程序设计语言都类似,我们不妨通过几个例子来体会一下:
表达式:10 * 5                                  返回结果50.0
表达式:if (10 * 5 = 50) then 55 else 56        返回结果:55
表达式:

<result> 
   numformat("####", if (10 * 5 = 50) then 55 else 56) 
</result>

返回结果:55
表达式:

<result> 
   numformat("###.##", if (10 * 5 = 50) then "55.5555" else "56.4444") 
</result>

请注意需要双引号。计算结果将返回:55.56
flwr 表达式
flwr(读作“flower”)是xquery最为有特色且是最为重要的的语法类型之一。它们看上去和sql的select 语句类似,并且具有相似的功能。flwr "flower", 代表 for, let, where, 以及 return表达式。 其中:
(1) for语句将一个或多个变量同表达式结合在一起,每一个变量都会被赋予一系列值,这些值正是相应的表达式求得的 ,整个的内容即是这些序列值得笛卡儿乘积 。
(2) let语句将变量直接与一个完整的表达式绑定在一起。如果for语句存在,由let创建的变量绑定就会加入到由for语句产生的tuple当中。 如果没有for语句,let语句将会产生一个带有所有变量绑定的 tuple。
(3) where语句适用于由for语句和let语句产生的tuple。
(4) return语句包含一个被用于生成flwr表达式结果的表达式。 
尽管一个完整的查询语句可以在一行内完成,xquery仍然采用缩进式程序设计风格来增加可读性。在我们的数据查询中,我们使用缩进式程序设计主要与输出的嵌套遥相呼应。例如输入中的 "for" 语句与输出中的 "for" 语句是在竖排对齐的。当然这是我们的编程风格,你大可保留自己的程序设计风格。  
例:for $e in document ("emp.xml")//name 
return <who> $e </who> 
上面的例子为每一个<name>元素返回一个 <who> 元素。输出的形式如下所示。实际的输出将取决于数据库的具体情况。不同的数据库输出格式将不同。
<who> <name> hari </name> </who> 
<who> <name> john </name> </who> 
...
<who> <name> leu </name> </who>
例:let $e := document ("emp.xml")//name 
return <who> $e </who> 
例子返回为由<name>元素组成的森林,并被包围在一个 <who>元素中。  
<who> 
   <name> hari </name>  
   <name> john </name> 
   ...
   <name> leu </name> 
</who>
需要注意的是上面的let语句都返回一个正确的 xml 文档。但是 for 语句不然。如果这是用户所希望的,那就很好。但是如果用户希望要得到一个格式整齐的xml文档,那么for查询将可以修改为。

<everyone> 
   for $e in document ("emp.xml")//name 
   return <who> $e </who> 

本文关键:XPath(转)
  相关方案
Google
 

本站最佳浏览方式为 分辨率 1024x768 IE 6.0(或更高版本的 IE浏览器)

go top