Marc
Marc

Reputation: 16512

how to group result in xquery

Sorry for the title, I didnt know what's the best title for this question

I'm having difficulties with XQUERY. The result is not what I expected

here's the xml

<Equipes>
        <Equipe>
            <equipeId>1</equipeId>
            <equipeNom>Equipe A</equipeNom>
            <JoueurEquipe>  
                <dateDebut>2011-01-01</dateDebut>
                <dateFin>2013-01-01</dateFin>
                <numero>1</numero>
                <joueurId>1</joueurId>
            </JoueurEquipe>
            <JoueurEquipe>
                <dateDebut>2010-01-01</dateDebut>
                <dateFin>2012-01-01</dateFin>
                <numero>2</numero>
                <joueurId>2</joueurId>
            </JoueurEquipe>
        </Equipe>
        <Equipe>
            <equipeId>2</equipeId>
            <equipeNom>Equipe B</equipeNom>
            <JoueurEquipe>  
                <dateDebut>2009-01-01</dateDebut>
                <dateFin>2012-01-01</dateFin>
                <numero>1</numero>
                <joueurId>3</joueurId>
            </JoueurEquipe>
            <JoueurEquipe>
                <dateDebut>2010-01-01</dateDebut>
                <dateFin>2014-01-01</dateFin>
                <numero>2</numero>
                <joueurId>4</joueurId>
            </JoueurEquipe>
        </Equipe>
    </Equipes>

and here's the query

for $b in doc("ligue.xml")/ligue/Equipes
    return 
    <Equipes>
    {
        $b/Equipe/equipeId, 
        $b/Equipe/equipeNom
    }
    </Equipes>

the result is

<equipes>
       <equipeId>1</equipeId>
       <equipeId>2</equipeId>
       <equipeNom>Equipe A</equipeNom>
       <equipeNom>Equipe B</equipeNom>
</equipes>

what I need is

<equipes>
           <equipeId>1</equipeId>
           <equipeNom>Equipe A</equipeNom>
           <equipeId>2</equipeId>
           <equipeNom>Equipe B</equipeNom>
 </equipes>

I don't know what i'm missing

Thank you

Upvotes: 0

Views: 84

Answers (1)

Charles Duffy
Charles Duffy

Reputation: 295403

Iterate over the things you actually want your output to iterate over:

<Equipes>{
for $b in doc("ligue.xml")/ligue/Equipes/Equipe[equipeId][equipeNom]
    return ($b/equipeId, $b/equipeNom)
}</Equipes>

Now, let's explore why your prior query behaved as it did. This:

for $b in doc("ligue.xml")/ligue/Equipes
    return 
    <Equipes>
    {
        $b/Equipe/equipeId, 
        $b/Equipe/equipeNom
    }
    </Equipes>

...finds the Equipes element, of which there's only one (making the for loop useless). It then searches for $b/Equipe/equipeId and $b/Equipe/equipeNom, both of which evaluate to lists containing multiple elements, and concatenates those two lists to get the output.

Upvotes: 3

Related Questions