清单 4. 包含简单业务逻辑的 XQuery
(: ————————– 🙂
(: declares ……:)
(: ————————– 🙂
declare namespace local = "http://localhost/ns";
declare variable $title as xs:string external;
declare variable $author as xs:string external;
declare variable $year as xs:string external;
declare variable $emptymsg as xs:string external;
declare variable $oversizedmsg as xs:string external;
declare variable $outputformat as xs:string external;
(: ————————– 🙂
(: functions 🙂
(: ————————– 🙂
declare function local:error_view($helpmsg as xs:string) {
if($helpmsg) then $helpmsg
else (‘<report status="0">Please call 1-800-123-4567</report>’)
};
declare function local:html_view($doc) {
<table>
<tr> <td>Library Name</td>
<td>Book Title</td>
<td>Number of Copies</td>
<td>Status</td>
</tr>
{ for $book in $doc/book
where $book/title/@lang="en"
order by $book/library
return <tr>
<td>{$book/library}</td>
<td>{$book/title/text()}</td>
<td>{$book/numberCopies}</td>
<td>{$book/status}</td>
</tr>
}
</table>
};
(: ————————– 🙂
(: the business logic 🙂
(: ————————– 🙂
let $docs := (‘bookinfor/book_collection.xml’)
let $searchdoc := (
<report status=’1′>
{
if($title and $year and $author) then (
for $doc in collection($docs)//booklist/book[contains(title,$title)
and (year = $year)]
where contains($doc//authors, $author)
return $doc
) else if($title and $year ) then (
for $doc in collection($docs)//booklist/book[contains(title,$title)
and (year = $year)]
order by $doc//booklist/book/title
return ($doc)
) else if($title and $author ) then (
for $doc in collection($docs)//booklist/book[contains(title,$title)]
where contains($doc//authors, $author)
order by $doc//booklist/book/title
return ($doc)
) else if($author and $year ) then (
for $doc in collection($docs)//booklist/book[(year=$year)]
where contains($doc//authors, $author)
order by $doc//booklist/book/title
return ($doc)
) else if($title) then (
for $doc in collection($docs)//booklist/book[contains(title,$title)]
order by $doc//booklist/book/title
return ($doc)
) else if($author) then (
for $doc in collection($docs)//booklist/book
where contains($doc//authors, $author)
order by $doc//booklist/book/title
return ($doc)
) else if($year) then (
for $doc in collection($docs)//booklist/book[(year=$year)]
order by $doc//booklist/book/title
return ($doc)
) else (
for $doc in collection($docs)
return ($doc//booklist/book)
)
}
</report>
)
(: ————————– 🙂
(: return results 🙂
(: ————————– 🙂
return if(count($searchdoc//book) eq 0) then local:error_view($emptymsg )
else if(count($searchdoc//book) gt 100)
then local:error_view($oversizedmsg)
else if($outputformat eq $html)
then local:html_view($searchdoc)
else $searchdoc
在应用程序中调用 XQuery 查询
为了在内嵌引擎中执行查询,需要设置相关的参数并预编译查询。查询执行后,最终结果发送回 Web 客户机。客户端 JavaScript 代码组装数据并呈现给用户。请注意,这个示例应用程序将目录 c:/tmp/xmldatasources/ 设置为静态的查询上下文。一定要保证 bookinfor 目录在其中,并在测试该应用程序之前将 XML 数据文件复制过去。清单 5 显示了内嵌的 XQuery 调用。
清单 5. 在应用程序中调用 XQuery 查询
dynamicQueryContext.setParameter("emptymsg", "No results exist!");
dynamicQueryContext.setParameter("oversizedmsg",
"Too many results, please refine queries");
staticQueryContext.setBaseURI("c:/tmp/xmldatasources/");
fileReader = new FileReader(request.getRealPath("/")+ "/queries/booklist_app.xql");
queryExpression = staticQueryContext.compileQuery(fileReader);
writer = new StringWriter();
StreamResult result = new StreamResult(writer);
Properties props = new Properties();
queryExpression.run(dynamicQueryContext, result, props);
retContent = writer.getBuffer();
结束语
需要注意的是,XQuery 技术仍然存在一些局限性,学起来也不是很简单。要记住,没有一种技术能够解决所有的业务问题。很可能仍然需要把 XQuery 与其他技术(如 XPath 和 XSLT)结合起来才能满足要求。
虽然 XQuery 还没有成为最终标准,但它的主要特性和功能已经引起了很大关注。它有强大的 XML 处理功能,而且在建立 marshup 应用程序方面显示了很大的潜力。一旦用 XQuery 实现了您的动态 Web 应用程序,可以很快地扩展您的网站,并以相对简单和敏捷的方式达到您的业务目标。
我们一直都在努力坚持原创.......请不要一声不吭,就悄悄拿走。
我原创,你原创,我们的内容世界才会更加精彩!
【所有原创内容版权均属TechTarget,欢迎大家转发分享。但未经授权,严禁任何媒体(平面媒体、网络媒体、自媒体等)以及微信公众号复制、转载、摘编或以其他方式进行使用。】
微信公众号
TechTarget
官方微博
TechTarget中国
作者
相关推荐
-
SAP收购CallidusCloud 与Salesforce竞争
一直被称为后台办公巨头的SAP现在似乎也想在前台办公大展拳脚。 最新的迹象是SAP收购CallidusClou […]
-
API设计如龙生九子 各不相同
IT咨询管理公司CA Technologies对API产业做了个问卷调查,问卷内容涉及API设计风格以及管理部署的新动向。调查结果表明,JSON与XML可谓两分天下。
-
八个超实用的jQuery技巧攻略
jQuery是JavaScript最好的库之一,主要用于制作动画、事件处理,支持Ajax及HTML脚本客户端。文中分享了8个超实用的jQuery代码技巧攻略,希望你会喜欢。
-
从头开始实现领域驱动设计
领域描述业务;它是驱动企业的概念和逻辑的集合。如果遵循领域驱动设计(DDD)这一本质,那么领域就是应用程序中最重要的组成部分。