2010-08-27 3 views
0

Je souhaite ajouter les valeurs de certaines balises XML, puis ajouter à nouveau le résultat. Mais j'ai de la difficulté à ajouter les résultats, donc je n'ai qu'un seul résultat final.Ajout double dans Xquery

Imaginez que vous avez ceci:

<nodeA> 
<nodeB> 
<item>1</item> 
<item>2</item> 
<yesno>blah</yesno> 
</nodeB> 
<nodeC> 
<thing>A</thing> 
</nodeC> 
</nodeA> 

<nodeA> 
<nodeB> 
<item>3</item> 
<item>4</item> 
<yesno>blah</yesno> 
</nodeB> 
<nodeC> 
<thing>B</thing> 
</nodeC> 
</nodeA> 

Je veux obtenir ce résultat <result>A,1,2,B,3,4</result> mais je reçois celui-ci: <result>A,1,2</result><result>B,3,4</result>

J'ai lu ceci: XQuery: how to properly append , in for loop mais je ne peux pas faire ça marche. Voici l'exemple de mon code.

let $contador := count(
    for $x in $productDoc//*[substring(local-name(.),2,23)="nodeB"] 
    where not(exists ($x/ns0:yesno)) 
    return 
    $x) 

return 
    if ($contador = 0) then 
     <result> </result> 
    else 
     for $x in $productDoc//*[substring(local-name(.),2,18)="nodeB"] 
     where not(exists ($x//ns0:yesno)) 
     return 
      for $y in $x//*[matches(name(.),'thing')] 
      let $z := $x//*[matches(name(.),'item')] 
      return 
      for $i in $y 
      let $c := concat($i,",",string-join($z,",")) 
      return   
       let $d := string-join($c,",") 
       <result>{ $d }</result> 

Je suppose que ce qui se passe est que j'annexant les résultats partiels à tort ... ou dans un mauvais endroit, mais je ne sais pas où le faire. Peut-être que je devrais appeler cette fonction d'une autre qui fait une jointure de chaîne du résultat. Qu'en penses-tu?

+0

Il est préférable de donner un exemple de XML et le résultat que vous voulez obtenir. Assez difficile de comprendre ce que vous voulez juste regarder dans votre code. – Shcheklein

+0

Je pensais que le code de l'exemple était visible, je l'ai édité pour le corriger. – deb

Répondre

1

La requête suivante renvoie exactement ce dont vous avez besoin (en cours d'exécution sur exemple vous avez fourni):

<result>{ 
string-join(
    for $nodeA in $productDoc//nodeA 
    return ($nodeA//thing, $nodeA//item), ",") 
}</result> 

Indiquez plus de détails dans votre question si vous avez besoin quelque chose de plus spécifique.

+0

Merci beaucoup. J'ai rajouté votre requête à mon fichier XML actuel et fonctionne correctement. Je pense que je rendais les choses plus compliquées qu'elles ne l'étaient. – deb