xQuery简单如果不是空的条件

时间:2010-12-15 10:12:42

标签: conditional xquery string

我正在尝试学习来自php背景的xQuery,我的表达式按预期运行

<![CDATA[
declare variable $doc as node() external;
declare variable $id external;

let $cont := data($doc//div[@class="cont"])
let $title := data($doc//p[@class="vtitle"])
let $text := data($doc//div[@class="venue-cont-left"])
return 
    <venue id="{$id}">
        <title>{$title}</title>
        <text>{$text}</text>
    </venue>     
]]>  

但是现在我只是想检查天气$ title是否为空

<![CDATA[
    declare variable $doc as node() external;
    declare variable $id external;

if(empty(data($doc//p[@class="vtitle"]))) then
(
        let $id :=$id
    return  
     <venue id="{$id}" />
) else (
let $cont := data($doc//div[@class="cont"])
let $title := data($doc//p[@class="vtitle"])
let $text := data($doc//div[@class="venue-cont-left"])
return 
    <venue id="{$id}">
        <title>{$title}</title>
        <text>{$text}</text>
    </venue>
)    
]]>

这不起作用,因为我得到了这个结果输出

<venue id="4">
   <title/>
   <text>
PHONE:
ADDRESS:....

如您所见,场地4没有标题,因此应该以{{1​​}}

的形式返回

感谢您的帮助!

2 个答案:

答案 0 :(得分:7)

使用:

declare variable $doc as node() external;
declare variable $id external;
declare variable $title := data($doc//p[@class="vtitle"]);
<venue id="{$id}">{
        if ($title)
        then <title>{$title}</title>
        else (),
        <text>{data($doc//div[@class="venue-cont-left"])}</text>
}</venue>

注意:空序列有效布尔值为false。

答案 1 :(得分:4)

我只能考虑一种情况,即您的查询失败的位置:如果您的XML包含这样的p节点而没有内容:

<p class="vtitle" />

这样,以下代码片段返回零长度字符串""(不是空序列):

data($doc//p[@class="vtitle"])

这里的问题是函数empty()检查空序列。因此,empty("")会返回false

如果你放弃empty()并切换你的代码应该工作的then和else表达式,那么就会处理有效布尔值(EBV)。并且,空字符串和空序列的EBV是false

希望有道理吗?