2010-11-23 26 views
2

le XML est comme ceci:Comment faire une boucle dans une structure xml avec xquery?

<persons> 
<person> 
<name/> 
<surname/> 
</person> 

<person index=1> 
<name/> 
<surname/> 
</person> 

<person index=2> 
<name/> 
<surname/> 
</person> 
... 
</persons> 

Je dois construire une vue qui affiche toutes les données de toutes les personnes.

name surname 
name1 surname1 

Comment faire cette boucle dans une instruction select? Cela doit être une vue.

+0

Bonne question, +1. Voyez ma réponse pour une très courte solution XPath one-liner. :) –

Répondre

0

Avez-vous envisagé d'utiliser xslt si vous avez besoin d'une transformation?

Si vous devez XQuery, pour sélectionner ces nœuds puis,

doc("file.xml")/persons/person/name | /persons/person/name 

OU

doc("file.xml")//name |// surname  

à savoir le nom, se produisant Nom partout

+0

le xml est une colonne d'une table dans la base de données. et si j'utilise le xpath:/persons/person/name il obtiendra seulement le premier qu'il trouve juste? – medusa

+0

Puis-je demander ce que vous utilisez au backend? Asp.NET? Java? PHP? Quant à votre question - Non, à ma connaissance, Il retournera un ensemble de nœuds appariés. –

1

Utilisation:

string-join(/*/person/concat(name, ' ', surname), '&#xA;') 

lorsque cette expression XPath est évaluée, sur le document XML suivant:

<persons> 
    <person index="1"> 
     <name>Alex</name> 
     <surname>Brown</surname> 
    </person> 
    <person index="2"> 
     <name>Katie</name> 
     <surname>Smith</surname> 
    </person> 
    <person index="3"> 
     <name>Julius</name> 
     <surname>Caesar</surname> 
    </person> 
</persons> 

le résultat est:

Alex Brown 
Katie Smith 
Julius Caesar 
+0

+1 Ceci est une meilleure réponse (ne pas utiliser 'for'). Pensez à utiliser 'string-join()' car sinon vous obtenez une séquence, donc après la nouvelle ligne, un espace sera ajouté. –

+0

@Alejandro: Je ne vais pas sortir le résultat en utilisant '', donc je ne suis pas concerné par l'apparence finale. Vous avez raison de dire qu'il existe plusieurs façons d'obtenir la concaténation des trois nœuds de texte sans aucun séparateur intermédiaire. Mais vous avez raison, de toute façon - j'ai édité ma réponse avec le correctif proposé. BTW, Pourquoi avez-vous supprimé votre réponse? S'il vous plaît, le restaurer, je voulais le remettre en question pour être aussi correct et assez court. –

+0

Merci, mais l'utilisation d'un appel de fonction comme dernière étape est meilleure dans un sens fonctionnel. –