我正在尝试学习来自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}}
的形式返回感谢您的帮助!
答案 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
。
希望有道理吗?