2010-12-15 109 views
2

Je suis en train d'apprendre xQuery provenant d'un fond de php, j'ai cette expression de travail comme prévuxQuery simple, sinon vide conditionnelle

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

Mais maintenant, je veux simplement faire un chèque temps $ title est vide ou non

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

cela ne fonctionne pas parce que je reçois cette sortie résultant

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

Comme vous s ee lieu 4 n'a pas de titre donc il aurait dû être retourné comme <venue id="4" />

Merci pour toute aide!

Répondre

3

Il n'y a qu'un seul scénario que je peux penser à l'endroit où votre requête échoue: Si votre XML contient un nœud p comme celui-ci sans contenu:

<p class="vtitle" /> 

Avec cela, l'extrait de code suivant retourne un zéro longueur chaîne "" (pas une séquence vide):

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

le problème ici est que la fonction empty() vérifie une séquence vide. Par conséquent, empty("") renvoie false.

Si vous laissez le empty() et que vous remplacez les expressions then et else, votre code devrait fonctionner, car la valeur booléenne effective (EBV) est alors traitée. Et, l'EBV d'une chaîne vide ainsi que d'une séquence vide est false.

Espérons que cela a du sens?

7

Utilisation:

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> 

Remarque: séquence vide efective valeur booléenne est fausse.