使用 XQuery 开发 mashup(二)

日期: 2007-12-09 作者:Ning Yan 来源:TechTarget中国

  清单 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

官方微博

TechTarget中国官方微博二维码

TechTarget中国

作者

Ning Yan
Ning Yan

相关推荐

  • SAP收购CallidusCloud 与Salesforce竞争

    一直被称为后台办公巨头的SAP现在似乎也想在前台办公大展拳脚。 最新的迹象是SAP收购CallidusClou […]

  • API设计如龙生九子 各不相同

    IT咨询管理公司CA Technologies对API产业做了个问卷调查,问卷内容涉及API设计风格以及管理部署的新动向。调查结果表明,JSON与XML可谓两分天下。

  • 八个超实用的jQuery技巧攻略

    jQuery是JavaScript最好的库之一,主要用于制作动画、事件处理,支持Ajax及HTML脚本客户端。文中分享了8个超实用的jQuery代码技巧攻略,希望你会喜欢。

  • 从头开始实现领域驱动设计

    领域描述业务;它是驱动企业的概念和逻辑的集合。如果遵循领域驱动设计(DDD)这一本质,那么领域就是应用程序中最重要的组成部分。