IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
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

XSL/XSLT/XPATH XML Discussion :

Récupérer la plus grande et la plus petite valeur d'un attribut


Sujet :

XSL/XSLT/XPATH XML

  1. #1
    Futur Membre du Club
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Juillet 2016
    Messages
    6
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 47
    Localisation : France, Somme (Picardie)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juillet 2016
    Messages : 6
    Points : 6
    Points
    6
    Par défaut Récupérer la plus grande et la plus petite valeur d'un attribut
    Bonjour.

    Comme précisé dans le titre, je cherche à récupérer la plus grande et la plus petite valeur d'un groupe d'attributs.
    En fouillant un peu le forum j'ai trouvé ceci :

    http://www.developpez.net/forums/d14...nd-d-attribut/

    L'expression XPath proposée par GrandFather fonctionne parfaitement pour récupérer la plus grande valeur (je précise que mes fichiers Xml ne sont pas très volumineux, donc pas de souci pour le coût).
    Je précise également que je travaille en XSLT 1.0

    Pour ce qui est de récupérer la plus petite valeur :
    J'ai essayé de remplacer le ">" de l'expression par un "<" = ne fonctionne pas (me casse ma génération html)
    J'ai également essayé de supprimer le "not" de l'expression = même résultat.

    Quelqu'un aurait il la gentillesse de m'aiguiller ?
    Merci d'avance !!

  2. #2
    Modérateur

    Profil pro
    Inscrit en
    Septembre 2004
    Messages
    12 551
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2004
    Messages : 12 551
    Points : 21 607
    Points
    21 607
    Par défaut
    Hello,

    on ne peut pas utiliser < parce qu'en XML c'est l'ouverture d'une balise -_-°. (... Ou en tout cas ça l'était en SGML et XML cherche à garder une certaine compatibilité ascendante.)

    En général tout le monde a appris en HTML la solution de remplacer > par &gt; et < par &lt;
    Eh bien c'est pareil en XML.

    Autre solution : si par exemple tu avais une comparaison A < B tu la remplaces par B > A.
    N'oubliez pas de consulter les FAQ Java et les cours et tutoriels Java

  3. #3
    Futur Membre du Club
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Juillet 2016
    Messages
    6
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 47
    Localisation : France, Somme (Picardie)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juillet 2016
    Messages : 6
    Points : 6
    Points
    6
    Par défaut
    Bonjour Thelvin, et merci pour la réponse.

    Effectivement après quelques recherches j'avais réglé ce souci par moi même (XML et Html sont 2 choses que je ne maîtrise pas, je suis Développeur Delphi et c'est la première fois que j'y suis confronté).
    J'ai maintenant un autre problème...
    Ci dessous un extrait du type de Xml que je cherche à traiter :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    <foo>
      <bar id="3" score="227" />
      <test>blablabla</test>
      <autre>blablabla</autre>
      <bar id="2" score="192" />
      <test>blablabla</test>
      <autre>blablabla</autre>
      <bar id="1" score="105" />
      <test>blablabla</test>
      <autre>blablabla</autre>
      ...
    </foo>
    Et ici un bout du Xsl que j'essaye de construire, sachant que je veux définir 2 variables, début et fin, globales et contenant les id correspondant aux min et max des scores :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    <xsl:variable name="debut" select="/foo/bar/@id[not(. &lt; ../../bar/@score)][1]">
    <xsl:variable name="fin" select="/foo/bar/@id[not(. &gt; ../../bar/@score)][1]">
    Mes 2 variables sont déclarées dans le stylesheet, pour être globales.
    Mon souci c'est que les deux me renvoient la même chose, à savoir "3", qui semble être la première occurence rencontrée.

    Idem si j'utilise la solution de GrandFather dont j'ai donné le lien au dessus (avec le < et le > remplacés bien évidemment).

    Une idée de où je me plante ?
    Merci.

    EDIT: Je me répond à moi-même, j'ai trouvé "une" solution en utilisant une boucle for-each et un sort :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
     
    <!--Renvoie le minimum-->
    <xsl:variable name="debut">
    <xsl:for-each select="/foo/bar">
    	<xsl:sort select="@score"/>
    	<xsl:if test="position()=1">
    		<xsl:value-of select="@id"/>
    	</xsl:if>
    </xsl:for-each>
    </xsl:variable>
     
    <!-- Renvoie le maximum-->
    <xsl:variable name="fin">
    <xsl:for-each select="/foo/bar">
    	<xsl:sort select="@score" order="descending"/>
    	<xsl:if test="position()=1">
    		<xsl:value-of select="@id"/>
    	</xsl:if>
    </xsl:for-each>
    </xsl:variable>
    PS: Je suis preneur de quelque chose de moins "dégueulasse" bien entendu ^^
    Merci !!

  4. #4
    Modérateur

    Profil pro
    Inscrit en
    Septembre 2004
    Messages
    12 551
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2004
    Messages : 12 551
    Points : 21 607
    Points
    21 607
    Par défaut
    La solution à base de for-each et de sort perd beaucoup en flexibilité, mais elle est bien meilleure en performances, et surtout elle marche pour des types de données qu'on ne peut pas comparer avec les opérateurs < et >
    En gros, je veux dire qu'elle marche avec des strings par ordre alphabétique aussi. D'ailleurs je te suggère d'ajouter data-type : <xsl:sort select="@score" data-type="number" /> sinon tu vas avoir des surprises.
    Donc bon, elle n'est pas horrible. C'est fréquent de faire comme ça.

    Cette remarque étant faite, l'écriture plus courte et très peu performante, marchait très bien.

    C'est juste qu'il faut pas comparer des id et des scores -_-°.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    <xsl:variable name="debut" select="/foo/bar[not(@score > ../bar/@score)][1]/@id">
    N'oubliez pas de consulter les FAQ Java et les cours et tutoriels Java

  5. #5
    Futur Membre du Club
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Juillet 2016
    Messages
    6
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 47
    Localisation : France, Somme (Picardie)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juillet 2016
    Messages : 6
    Points : 6
    Points
    6
    Par défaut
    Ah bin oui effectivement
    Merci pour le retour d'info et la petite précision apportée.
    (ainsi que la data-type à ajouter)

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Réponses: 52
    Dernier message: 13/03/2007, 15h07
  2. Réponses: 13
    Dernier message: 07/01/2007, 19h43
  3. [XPath]fonction récupérer plus grand valeur d'un attribut ?
    Par snoop dans le forum XSL/XSLT/XPATH
    Réponses: 3
    Dernier message: 18/05/2006, 14h27
  4. Requete récupérer les 3 numéros les plus grands
    Par nerick dans le forum Langage SQL
    Réponses: 2
    Dernier message: 05/01/2006, 13h51
  5. Réponses: 3
    Dernier message: 16/12/2002, 16h12

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo