xquery:xml的sql

由于项目需要,最近较深入的研究了一下xquery.
通常我们解析xml文档,sax,jdom,dom4j是常用工具.不过看到满篇的hasChild(),getChild()是否很头痛.
其实如果采用xquery来处理xml,一切都显得很优雅.
xquery之于xml,就如同sql之于关系数据库,写xquery脚本,就如同写sql,存储过程一样的爽.
并且,xquery还可以扣网页,用超级简单的手段就可以做出令人匪夷所思的效果.
java中的xquery引擎,目前较好的是saxon.把saxon8.jar加到自己的classpath,就可以开始java的xquery开发了.
至于调试工具,你当然可以用java代码来进行,不过,stylus和xmlspy都支持xquery,相比之下,stylus支持的更好,支持点语法.写起来顺手许多.
只是国内用的人少,社区支持不多.不过,熟悉了它的语法,写起脚本来,还是很爽的.
flowor语法对应sql语句, let $a := if () then () else () 类似oracle的decode()函数,concat()为合并字符串,字符串是否相等为eq,至于其他函数,用的时候查查这个就可以了:
http://www.w3.org/TR/xquery-operators/#func-number-examples
http://www.w3.org/TR/2004/WD-xquery-20040723/#node-tests

好了,下班了,备份一下今天的xquery代码: osstr.xquery

xquery version "1.0";

declare variable $content :=//ResponseMessage;

declare variable $tmpelement:= local:getTmpelement();

declare function local:getTmpelement() as element() {
 if(exists($content/results/WFA/TRTRERSP)) then
  $content/results/WFA/TRTRERSP
 else if (exists($content/results/WFA/CKTIDRSP) )then
  $content/results/WFA/CKTIDRSP
 else
     ""
};

(:create fact node:)
declare function local:creatFact($s as element()) as element() {
  <fact>
  <TN value="{replace(//CKTID,"/","")}"/>
  <LN value="{//CUSTNAME}"/>
  <SA value="{//CUSTADDR}"/>
  <LOC value="{//P2LOC}"/>
  <TTN value="{//TR}"/>
  <TRBL value="{//TRBLTYPE}"/>
  <STATUS value="{(//STATUS/STATUS)[1]}"/>
  <DATE value="{(//STATUS/STAT_DT)[1]}"/>
  <TIME value="{(//STATUS/STAT_TM)[1]}"/>
  <flag value="{local:createGroupKey($content/results/WFA)}"/>
 </fact>
};

declare function local:getMCN($s as xs:string) as xs:string {
 if (string-length($s) > 4) then
  substring($s,4,2)
 else
  ""
  
};

declare function local:getOCS($s as xs:string) as xs:string {
 if ($s eq "Y" or $s eq "y" ) then
  "OCS"
 else
  ""
};

declare function local:createGroupKey($root as element()) as xs:string {
 let $n :=
     normalize-space(
   concat(local:createGrpkey($root )," ",
    $tmpelement/CSN," ",
    $tmpelement/CSU,"  ",
    $tmpelement/MP_USOC," ",
    $tmpelement/MP_USOC1," ",
    $tmpelement/MP_USOC2

    )
   )
   
    let $m :=
  if (exists($tmpelement/MCN)) then
   local:getMCN($tmpelement/MCN)
  else
   ""
 let $o:=
  if (exists($tmpelement/OCS)) then
   local:getOCS($tmpelement/OCS)
  else
   "" 
 return
  normalize-space(
   concat($n, " ", $m, " ",$o)
  )
};

declare function local:createGrpkey($root as element()) as xs:string {
   if (exists($root/USERMSGS)) then
     concat($root/USERMSGS/GRPKEY01, " ",
     $root/USERMSGS/GRPKEY02, " ",
     $root/USERMSGS/GRPKEY03, " ",
     $root/USERMSGS/GRPKEY04, " ",
     $root/USERMSGS/GRPKEY05, " ",
     $root/USERMSGS/GRPKEY06, " ",
     $root/USERMSGS/GRPKEY07, " "
     )
 else
      ""
};

(:create formatData node
declare function local:formatData($root as element()) as element() {


};
:)

<adapter>
{
if (exists($content/results/WFA)) then
<out>
 {
  local:creatFact($content /results/WFA)
 }
</out>
else
<out>no wfa</out>
}
</adapter> 

  • 0
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
XML》实验任务书 XQuery [实验目的] 1、学习如何使用XMLSPY集成开发环境编写、执行、以及调试XQuery。 2、理解和掌握XQuery查询计划的基本结构、各种子句的使用、(递归)函数的声明和使用、嵌套查询的使用,能够熟练地利用集成开发环境编写完成各种查询工作的XQuery查询计划,为在主流关系数据库中使用XQuery进行数据检索打下基础。 [实验内容和步骤] 1、使用XMLSPY集成开发环境,创建XQuery查询计划,熟悉工具菜单中为XQuery的执行、调试提供的各种支持。 2、逐个打开并执行XQuery->W3CUseCases中各类查询中给出的查询计划,并且弄懂其含义,并尝试自行编写; 3、打开附件中提供的Flights-Data.xml文档,编写下列XQuery查询计划,要求所得的结果必须是良构的XML文档: ①. 列出2005-12-24日从North Pole出发的所有航班(dataQ1.xquery); ②. 查询2005-12-24日最繁忙(计算出发和到达航班)的机场、以及其进出航班总数(dataQ2.xquery); ③. 按照2005-12-24日机场繁忙程度(计算进出旅客总数)列出机场(忽略没有旅客进出的机场)、以及其进出旅客总数(dataQ3.xquery); ④. 查询所有名为Santa Claus的乘客的航班目的地(dataQ4.xquery); 在上述查询计划中,③相对比较复杂,需要使用一些嵌套查询,如果有必要,可以逐步编写子查询,通过调试或者执行观察结果,然后组合构成完整的查询计划;也可以将某些嵌套查询封装为函数(需要使用序列类型来自定义函数),以增加查询计划的可读性。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值