2010-12-15 15 views
2

我努力學習XQuery與一個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>  
]]> 

不過現在我只想做一個檢查天氣$標題爲空或不

<![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> 
)  
]]> 

正如你S此不起作用,因爲我得到這個結果輸出

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

EE會場4沒有標題,所以應該已經返回<venue id="4" />

感謝您的幫助!

回答

3

只有一種情況下,我能想到的在您的查詢失敗:如果您的XML包含p節點像這樣沒有內容:

<p class="vtitle" /> 

這樣,下面的代碼片段返回零長度串""(不是空序列):

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

的這裏的問題是,該功能empty()檢查空序列。因此,empty("")返回false

如果您將離開empty()並切換then和else表達式,那麼您的代碼應該可以工作,因爲之後會處理有效布爾值(EBV)。而且,空字符串以及空序列的EBV是false

希望有道理嗎?

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> 

注意:空序列efective布爾值是假的。