Publicité
+ Répondre à la discussion
Affichage des résultats 1 à 6 sur 6
  1. #1
    Nouveau Membre du Club
    Inscrit en
    avril 2009
    Messages
    158
    Détails du profil
    Informations forums :
    Inscription : avril 2009
    Messages : 158
    Points : 39
    Points
    39

    Par défaut requete et condition sous BaseX

    Bonjour ,

    Je viens de commencé avec XQuery , je l'utilise sous BaseX.
    j'ai crée juste un fichier XML comme un exemple :

    Code :
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
     
    <?xml version="1.0" encoding="UTF-8"?>
    <personnes>
       <etudiant classe="P2">
          <nom>CynO</nom>
          <prenoms>
             <prenom>Nicolas</prenom>
             <prenom>Laurent</prenom>
          </prenoms>
       </etudiant>
       <etudiant classe="P1">
          <nom>Superwoman</nom>
       </etudiant>
       <etudiant classe="P1">
          <nom>Don Corleone</nom>
       </etudiant>
    </personnes>
    et je veux extraire les prenom qui ont Cyn0 comme nom. quel est la requete que je dois utiliser ; si c'est en SQL sa sera du genre
    Code :
    1
    2
    Select prenom from MaTable
    where nom='Cyn0'
    ET je veux savoir quel est la différence entre Exist et BaseX ?!

    Merci d'avance

  2. #2
    Rédacteur
    Avatar de Erwy
    Homme Profil pro erwan
    Développeur Web
    Inscrit en
    novembre 2003
    Messages
    4 974
    Détails du profil
    Informations personnelles :
    Nom : Homme erwan
    Âge : 37
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Développeur Web
    Secteur : Administration - Collectivité locale

    Informations forums :
    Inscription : novembre 2003
    Messages : 4 974
    Points : 10 978
    Points
    10 978

    Par défaut

    Il y a différentes façon de faire ceci, certaine plu simple que ce que j'écris ici mais la requête "typique" Xquery ressemblera à ça
    Code :
    1
    2
    3
    for $x in  doc("personne.xml")/personnes/etudiant
    where $x/nom='CynO'
    return $x/prenoms
    le système n'a rien à voir avec un select from where du sql , il est base de boucle imbriqué et d'appel de fonction.
    Néanmoins dans cette partie : le for sélectionne les éléments sur lesquels on va travailler.
    le where effectue les test
    le returne renvoie les valeurs finales
    modérateur/rédacteur XML
    Je ne reponds pas aux questions par MP

    Quand une réponse vous a été utile, pensez à utiliser le nouveau système de notation

  3. #3
    Nouveau Membre du Club
    Inscrit en
    avril 2009
    Messages
    158
    Détails du profil
    Informations forums :
    Inscription : avril 2009
    Messages : 158
    Points : 39
    Points
    39

    Par défaut

    Merci pour votre réponse,
    Le problème que je rencontre maintenant c'est que je peux pas afficher les valeurs UNE par Une ... un exemple pour bien comprendre :

    j'ai le fichier XML suivant :
    Code :
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
     
    <?xml version="1.0" encoding="ISO-8859-1"?>
    <Trace date="2011-02-14 09:33:21" name="Groupe 1">
     
         <Operation>
    		<Type>Del</Type>
    		<Position>11</Position>
    		<Offset>1</Offset>
    		<Timestamp>1297672512653</Timestamp>
    		<NumDocument>1</NumDocument>
    		<NumReplica>0</NumReplica>
    		<VectorClock>
    		<Entry>
    		<Replica>2</Replica>
    		<Clock>143</Clock>
    		</Entry>
    		<Entry>
    		<Replica>0</Replica>
    		<Clock>12</Clock>
    		</Entry>
    		<Entry>
    		<Replica>4</Replica>
    		<Clock>7</Clock>
    		</Entry>
    		</VectorClock>
    	</Operation>
     
           <Operation>
    		<Type>AUTRE</Type>
    		<Position>11</Position>
    		<Offset>1</Offset>
    		<Timestamp>1297672512653</Timestamp>
    		<NumDocument>1</NumDocument>
    		<NumReplica>0</NumReplica>
    		<VectorClock>
    		<Entry>
    		<Replica>2</Replica>
    		<Clock>143</Clock>
    		</Entry>
    		<Entry>
    		<Replica>0</Replica>
    		<Clock>12</Clock>
    		</Entry>
    		<Entry>
    		<Replica>4</Replica>
    		<Clock>7</Clock>
    		</Entry>
    		</VectorClock>
    	</Operation>
     
         <Operation>
    		<Type>Del</Type>
    		<Position>18</Position>
    		<Offset>1</Offset>
    		<Timestamp>1297672533513</Timestamp>
    		<NumDocument>2</NumDocument>
    		<NumReplica>0</NumReplica>
    		<VectorClock>
    		<Entry>
    		<Replica>2</Replica>
    		<Clock>165</Clock>
    		</Entry>
    		<Entry>
    		<Replica>0</Replica>
    		<Clock>13</Clock>
    		</Entry>
    		<Entry>
    		<Replica>4</Replica>
    		<Clock>22</Clock>
    		</Entry>
    		</VectorClock>
    	</Operation>
     
    	<Operation>
    		<Type>Del</Type>
    		<Position>17</Position>
    		<Offset>1</Offset>
    		<Timestamp>1297672533700</Timestamp>
    		<NumDocument>1</NumDocument>
    		<NumReplica>0</NumReplica>
    		<VectorClock>
    		<Entry>
    		<Replica>2</Replica>
    		<Clock>165</Clock>
    		</Entry>
    		</VectorClock>
    	</Operation>
    </Trace>
    pour la première balise <Operation> je veux afficher: Valeur_de_Replica"-"Valeur_de_Clock, dans notre exemple ça sera : [2-143 ,0-12,4-7] et je recommence la même pour la deuxiéme balise <Operation>...

    j'ai pu faire une requete:
    Code :
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
     
     
    for $x in  /Trace/Operation
    let $r :=$x//Replica
    let $c :=$x//Clock
    where $x/Type = 'Del'
     
    return
    <result>
    {$r/text() ,"-", $c/text()}
    </result>
    mais il m'affiche touuuuuus les valeurs de Replica puis Touuuuuus les valeur de Clock dans l'exemple:

    Code :
    1
    2
    3
    4
     
    <result>204-143127</result> <<< ici il m'affiche tous à la fois alors que je veux 2-143,0-12 et 4-7
    <result>204-1651322</result>
    <result>2-165</result>
    il m'affiche tout à la fois alors que je veux affiché une par une. qu'est ce que dois faire svp ?

  4. #4
    Nouveau Membre du Club
    Inscrit en
    avril 2009
    Messages
    158
    Détails du profil
    Informations forums :
    Inscription : avril 2009
    Messages : 158
    Points : 39
    Points
    39

    Par défaut

    Bon j'ai pu amélioré un peu le programme , j'ai fait :

    Code :
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
     
    for $x in  /Trace/Operation
     
      let $r :=$x//Replica
    	let $c :=$x//Clock
     
    for $i in $r,$j in $c
     
    where $x/Type='Del'
     
    return
     
    concat ("[",concat($i,"-",$j),"]")
    et j'ai un affichage comme un produit cartésien , c'est normal parceque j'ai deux boucle for imbriqué ... mais la question maintenant est comment faire deux boucle à la fois et qui ne seront pas imbriqué ?
    exemple :

    Code :
    1
    2
    3
    4
     
    for $i in ("A","B","C","D")
    for $j in ("1","2","3","4")
    return concat($i,$j)
    j'aurai comme résultat :
    A1 A2 A3 A4 B1 B2 B3 B4 C1 C2 C3 C4 D1 D2 D3 D4


    comment faire pour avoir seulement:
    A1 B2 C3 et D4

  5. #5
    Nouveau Membre du Club
    Inscrit en
    avril 2009
    Messages
    158
    Détails du profil
    Informations forums :
    Inscription : avril 2009
    Messages : 158
    Points : 39
    Points
    39

    Par défaut

    Re salut,

    Bon je vois que j'ai posté plusieurs exemple et trop de blabla ... peut etre y aura des gens qui n'ont pas compris . alors je vais m'expliquer plus clairement.

    dans un exemple de XML :
    Code :
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
     
    <personnes>
    <etudiant>
        <nom>nom1</nom>
         <prenom>prenom1</prenom>
    </etudiant>
    <etudiant>
        <nom>nom2</nom>
         <prenom>prenom2</prenom>
    </etudiant>
    </personnes>
    je veux avoir comme résultat :
    [nom1,nom2]
    [prenom1,prenom2]


    au début j'ai fait une double boucle for , du genre :
    Code :
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    for $x in /personnes/etudiant
    
    let $r :=$x//nom
    let $c :=$x//prenom
    
    for $i in $r
    for $j in $c
    return
    concat($i,"   ",$j)
    j'avais comme résultat
    nom1 nom1 , nom1 prenom1 , nom2 nom1 et nom2 prenom2

    pour éviter ce problème j'ai ajouté un compteur .
    mon programme est devenu :
    Code :
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    for $x in /personnes/etudiant
    
    let $r :=$x//nom
    let $c :=$x//prenom
    let $result := concat($i,"-",$j)
    for $i at $c1 in $r
    for $j at $c2 in $c
    return
    
    if($c1=$c2) then
    concat("   ",$result)
    voilà le problème est résolu pour l'effet de la boucle imbriqué ( s'il y aura des gens qui auront des problèmes de ce genre voila la solution )

    il me reste juste une seul question , comment faire un saut de ligne dans XQuery ?
    Code :
    1
    2
    3
    4
    return
    
    concat("   ",$result) <<<  au lieur de "   " je veux un saut de ligne.
    Merci d'avance

  6. #6
    Rédacteur
    Avatar de Erwy
    Homme Profil pro erwan
    Développeur Web
    Inscrit en
    novembre 2003
    Messages
    4 974
    Détails du profil
    Informations personnelles :
    Nom : Homme erwan
    Âge : 37
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Développeur Web
    Secteur : Administration - Collectivité locale

    Informations forums :
    Inscription : novembre 2003
    Messages : 4 974
    Points : 10 978
    Points
    10 978

    Par défaut

    J'ai l'impression d'avoir le même résultat avec :
    Code :
    1
    2
    3
    4
    xquery version "1.0";
    for $x in  doc("personne.xml")/personnes/etudiant
     
    return concat($x/prenom,' ',$x/nom,';')
    Pour le retour à la ligne il te faudra utiliser les caractères unicode
    modérateur/rédacteur XML
    Je ne reponds pas aux questions par MP

    Quand une réponse vous a été utile, pensez à utiliser le nouveau système de notation

Liens sociaux

Règles de messages

  • Vous ne pouvez pas créer de nouvelles discussions
  • Vous ne pouvez pas envoyer des réponses
  • Vous ne pouvez pas envoyer des pièces jointes
  • Vous ne pouvez pas modifier vos messages
  •