Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

XQUERY/SGBD XML Discussion :

Requêtes XQuery qui ne fonctionnent pas


Sujet :

XQUERY/SGBD XML

  1. #1
    Nouveau membre du Club
    Requêtes XQuery qui ne fonctionnent pas
    Bonjour,

    J'aurais deux question a vous poser en XQuery. Je n'arrive pas a trouver la solution qui doit être simple. Pouvez-vous m'aiguiller ?

    Question 1:

    Définir une fonction qui transforme 1 noeud bookmark passé en paramètre en 1 noeud élément div,tel que
    • Le titre et l'url sont mis dans un premier paragraphe (élément p) qui contient un lien (élément a) ayant pour référence l'url et pour contenu textuel, le titre s'il existe et à défaut l'url.
    • Si la description existe elle est mise dans un second paragraphe

    Code :Sélectionner tout -Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    declare function local:sortie_bookmarks($bm as element(bookmark)) as element(div){
    element div {
        element p {
          <a href='{$bm/@url}'>{if (exists($bm/title/text())) then ($bm/title/text()) else ($bm/@url)}</a>
        },
        element p {
          if (exists($bm/description/text())) then $bm/description/text() else ()
        }
      }
    };
    
    local:sortie_bookmarks(//bookmark[@url="http://www.linux.org"])


    le code ci-dessous ne fonctionne pas correctement

    Code :Sélectionner tout -Visualiser dans une fenêtre à part
    <a href='{$bm/@url}'>{if (exists($bm/title/text())) then ($bm/title/text()) else ($bm/@url)}</a>


    Question 2:

    Je sèche sur cette question:

    URL de l'XML http://www.fil.univ-lille1.fr/~caronc/SGBD/bookmarks.xml

    Définir une fonction qui transforme 1 noeud categorie passé en paramètre en 1 noeud div,tel que

    Le nom de la catégorie apparaît en titre h3
    La description est rangée dans un paragraphe
    Puis, on affiche récursivement les sous-catégories et les bookmarks (cf question précédente)

    J'ai commence par cela mais cela ne fonctionne pas

    Code :Sélectionner tout -Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    declare function local:sortie_categorie($cat as element(categorie)) as element(div){
    element div {
        element h3 {
          $cat/@nom/text()
        },
        element p {
          $cat/bokmark/decription/text()
        }
      }
    };
     
    local:sortie_bookmarks(//bookmark[@url="http://www.lesite.org"])


    Merci pour votre aide,

    Nikolas

  2. #2
    Modérateur

    Question 1 :

    Quand tu sélectionnes $bm/@url tu sélectionnes un attribut qui s'appelle url. Donc quand tu produis ça entre <a> et </a> tu produis un attribut nommé url. Un attribut doit toujours être associé à un élément, ce qui fait que là, l'attribut url va aller se mettre dans la balise <a>.

    Bref tu as besoin de produire un texte et pas un attribut. Une solution est de faire string($bm/@url). La fonction string(), comme son nom l'indique, transforme ce qu'on lui donne en string. Dans le cas d'un attribut, ça consiste à prendre la valeur de cet attribut.

    Tu te demandes certainement pourquoi ça marchait avec href='{$bm/@url}' qui sélectionne exactement la même chose. Oui, cela aussi sélectionne un attribut. Mais dans le but de produire le contenu d'un autre attribut. Le contenu produit à l'intérieur d'un attribut est automatiquement converti en string (puisque rien d'autre n'est possible, contrairement au contenu d'un élément,) et donc tu n'as pas besoin de le faire toi-même.

    Question 2 :

    "Cela ne fonctionne pas" c'est pas très clair. Juste une remarque donc.

    On ne peut pas faire @nom/text(). Cela veut dire "sélectionner l'attribut nom. Puis, parmi ses enfants, sélectionner les nœuds textes." Un attribut n'a pas d'enfant, que ce soit des nœuds textes ou autre chose. Un attribut a un nom, une valeur, et c'est tout. Si on lui cherche des enfants, on ne trouve rien.

    Ne mets pas ce /text() inutile. Par contre tu devras refaire ce que j'ai dit en question 1.
    N'oubliez pas de consulter les FAQ Java et les cours et tutoriels Java

  3. #3
    Nouveau membre du Club
    Merci pour ton aide thelvin, je teste...

    Nikolas

  4. #4
    Nouveau membre du Club
    Question complementaire:

    Code :Sélectionner tout -Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
     
    declare function local:sortie_categorie($bks as element(bookmarks)) as element(div){
    element div {
        element h3 {
          for $y in $bks
          return $y
        }
      }
    };
     
    local:sortie_categorie(/*)


    Je souhaite avoir tout les attributs nom de la première catégorie et je n'y arrive pas !!! $y me donne les catégories et les sous-categories !! J'ai essayé avec string, $bks/@nom etc....

    Pourriez-vous m'aider ?

    Nikolas

  5. #5
    Modérateur

    Je comprends pas trop de quoi tu parles...

    "Tous les attributs nom de la première catégorie"... La première catégorie n'a qu'un seul attribut nom bien sûr, puisqu'un élément ne peut pas avoir plusieurs fois le même attribut...
    N'oubliez pas de consulter les FAQ Java et les cours et tutoriels Java