xQuery простой, если не пустой условный - PullRequest
2 голосов
/ 15 декабря 2010

Я пытаюсь узнать xQuery, исходящий из фона php, у меня это выражение работает как положено

<![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 нет названия, поэтому оно должно быть возвращено как <venue id="4" />

Спасибо за любую помощь!

Ответы [ 2 ]

7 голосов
/ 15 декабря 2010

Использование:

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.

4 голосов
/ 15 декабря 2010

Есть только один сценарий, который я могу вспомнить, где ваш запрос не выполняется: если ваш XML содержит такой узел p, как этот, без содержимого:

<p class="vtitle" />

При этом следующий фрагмент кода возвращает строку нулевой длины "" (не пустая последовательность):

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

Проблема здесь в том, что функция empty() проверяет наличие пустой последовательности. Следовательно, empty("") возвращает false.

Если вы пропустите empty() и переключите выражения then и else, ваш код должен работать, потому что тогда обрабатывается Effective Boolean Value (EBV). И EBV пустой строки, а также пустой последовательности: false.

Надеюсь, что имеет смысл?

...