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 :

for-each & sort sur plusieurs attributs [XSLT 1.0]


Sujet :

XSL/XSLT/XPATH XML

  1. #1
    Membre expert
    Avatar de Metalman
    Homme Profil pro
    Enseignant-Chercheur
    Inscrit en
    Juin 2005
    Messages
    1 049
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 35
    Localisation : France, Hauts de Seine (Île de France)

    Informations professionnelles :
    Activité : Enseignant-Chercheur
    Secteur : Enseignement

    Informations forums :
    Inscription : Juin 2005
    Messages : 1 049
    Points : 3 532
    Points
    3 532
    Par défaut for-each & sort sur plusieurs attributs
    Bonjour la communauté XML,

    Avant toute chose, je débute totalement en XML/XSLT/XPath, soyez indulgents... (histoire de pas me faire incendier :p car mon problème serait "peut être" du XPath...)

    Mon contexte : je cherche à transformer des documents EPML (EPC XML... des modèles proches du BPMN encodés en XML) en SVG pour avoir une visualisation graphique... Actuellement, un XSL de 2004 semble pouvoir faire ce travail, mais j'ai un mal fou à le faire correctement fonctionner, et je le débugge depuis quelques jours.
    Il nécessite Xalan, que j'ai installé et réussi à faire fonctionner.

    J'arrive à générer un SVG et des HTML, mais ceux-ci ne s'affichent pas, et surtout, certaines valeurs restent à NaN.
    Après un peu de debug, je suis arrivé au fait qu'un des attributs n'est pas reconnu par le parser.


    Voici le XSL actuel qui renvoie un NaN :
    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
     
            <xsl:variable name="Ymax">
              <xsl:choose>
                <xsl:when test=".//*[@y]">
                  <xsl:for-each select=".//*[@y]">
                    <xsl:sort select="number(@y)+number(@height)" data-type="number" order="descending"/>
                    <xsl:if test="position()=1">
                      <xsl:value-of select="$Scaling*(number(@y)+number(@height))"/>
                    </xsl:if>
                  </xsl:for-each>
                </xsl:when>
                <xsl:otherwise>
                  <xsl:value-of select="1"/>
                </xsl:otherwise>
              </xsl:choose>
            </xsl:variable>
    Voici le résultat sur le SVG & HTML :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    <svg width="NaN" height="NaN" xmlns:xlink="http://www.w3.org/1999/xlink" xmlns:java="http://xml.apache.org/xslt/java">
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    <p><b>EPC name: Lager</b><br/><b>Xmax: NaN</b><br/><b>Ymax: NaN</b><br/></p><EMBED TYPE="image/svg" name="SVG_map" src="epcId1.svg" width="NaN" height="NaN" border="1"/>
    En testant, @y me renvoie bien une valeur, mais @height non.

    Je "pense" que ma difficulté vient du fait que je n'arrive pas à filtrer uniquement les lignes contenant un "y" et un "height" simultanément.
    Dans les données que je lis en entrée dans mon EPML, il y a parfois ça :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    <position x="626" y="296" width="249" height="158"/>
    Et parfois juste ça :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    <position x="750" y="454"/>
    Ne connaissant pas encore très bien XSL, je ne sais pas si le bout de XSL gère ou non déjà l'imbrication des balises "position"...
    ...ni si il est possible de tester plusieurs valeurs sur une même ligne de données. (apparemment for-each n'est pas bon pour ça ?)
    --
    Metalman !

    Attendez 5 mins après mes posts... les EDIT vont vite avec moi...
    Les flags de la vie : gcc -W -Wall -Werror -ansi -pedantic mes_sources.c
    gcc -Wall -Wextra -Werror -std=c99 -pedantic mes_sources.c
    (ANSI retire quelques fonctions comme strdup...)
    L'outil de la vie : valgrind --show-reachable=yes --leak-check=full ./mon_programme
    Et s'assurer que la logique est bonne "aussi" !

    Ma page Developpez.net

  2. #2
    Membre expert
    Avatar de Metalman
    Homme Profil pro
    Enseignant-Chercheur
    Inscrit en
    Juin 2005
    Messages
    1 049
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 35
    Localisation : France, Hauts de Seine (Île de France)

    Informations professionnelles :
    Activité : Enseignant-Chercheur
    Secteur : Enseignement

    Informations forums :
    Inscription : Juin 2005
    Messages : 1 049
    Points : 3 532
    Points
    3 532
    Par défaut
    Rebonsoir,

    J'ai essayé entre temps d'insérer une variable dans la déclaration de ma variable... pour "capturer" l'hypothétique height qui apparaitrait, mais le résultat est plutôt mitigé...

    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
    21
    22
    23
    24
    25
    26
    27
     
            <xsl:variable name="Ymax">
              <xsl:choose>
                <xsl:when test=".//*[@y]">
                  <xsl:for-each select=".//*[@y]">
     
                    <xsl:variable name="MyHeight">
                      <xsl:choose>
                        <xsl:when test=".//*[@height] &gt; 1">
                          <xsl:value-of select=".//*[@height]"/>
                        </xsl:when>
                        <xsl:otherwise>
                          <xsl:value-of select="0"/>
                        </xsl:otherwise>
                      </xsl:choose>
     
                    <xsl:sort select="number(@y)+number({$MyHeight})" data-type="number" order="descending"/>
                    <xsl:if test="position()=1">
                      <xsl:value-of select="$Scaling*(number(@y)+number({$MyHeight}))"/>
                    </xsl:if>
                  </xsl:for-each>
                </xsl:when>
                <xsl:otherwise>
                  <xsl:value-of select="1"/>
                </xsl:otherwise>
              </xsl:choose>
            </xsl:variable>
    L'erreur ressemble à ça, du coup :
    The element type "xsl:variable" must be terminated by the matching end-tag "</xsl:variable>".
    --
    Metalman !

    Attendez 5 mins après mes posts... les EDIT vont vite avec moi...
    Les flags de la vie : gcc -W -Wall -Werror -ansi -pedantic mes_sources.c
    gcc -Wall -Wextra -Werror -std=c99 -pedantic mes_sources.c
    (ANSI retire quelques fonctions comme strdup...)
    L'outil de la vie : valgrind --show-reachable=yes --leak-check=full ./mon_programme
    Et s'assurer que la logique est bonne "aussi" !

    Ma page Developpez.net

  3. #3
    Membre émérite Avatar de tsuji
    Inscrit en
    Octobre 2011
    Messages
    1 558
    Détails du profil
    Informations forums :
    Inscription : Octobre 2011
    Messages : 1 558
    Points : 2 736
    Points
    2 736
    Par défaut
    A la rigueur, on peut faire comme ça pour les lignes #3 et #4 dans le post premier.
    Code xslt : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
                <xsl:when test=".//*[@y and @height and not(number(@y))=NaN and not(number(@height))=NaN]">
                  <xsl:for-each select=".//*[@y and @height and not(number(@y))=NaN and not(number(@height))=NaN]">
    Une conséquence est qu'on peut faire après descending ou ascending etc, et le comportement du xslt est toujours bien.

  4. #4
    Membre expert
    Avatar de Metalman
    Homme Profil pro
    Enseignant-Chercheur
    Inscrit en
    Juin 2005
    Messages
    1 049
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 35
    Localisation : France, Hauts de Seine (Île de France)

    Informations professionnelles :
    Activité : Enseignant-Chercheur
    Secteur : Enseignement

    Informations forums :
    Inscription : Juin 2005
    Messages : 1 049
    Points : 3 532
    Points
    3 532
    Par défaut
    Merci !

    Cela résoudre effectivement le problème du NaN et des multiples tests !
    --
    Metalman !

    Attendez 5 mins après mes posts... les EDIT vont vite avec moi...
    Les flags de la vie : gcc -W -Wall -Werror -ansi -pedantic mes_sources.c
    gcc -Wall -Wextra -Werror -std=c99 -pedantic mes_sources.c
    (ANSI retire quelques fonctions comme strdup...)
    L'outil de la vie : valgrind --show-reachable=yes --leak-check=full ./mon_programme
    Et s'assurer que la logique est bonne "aussi" !

    Ma page Developpez.net

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

Discussions similaires

  1. [XSLT] XSLT sort dans un for-each avec select sur un param
    Par tralloc dans le forum Format d'échange (XML, JSON...)
    Réponses: 5
    Dernier message: 23/11/2012, 09h06
  2. Trier (Sort) sur un attribut d'un attribut d'une liste
    Par Gaaaga dans le forum ActionScript 3
    Réponses: 2
    Dernier message: 06/05/2008, 10h29
  3. Sort sur plusieurs colonnes
    Par denice007 dans le forum Linux
    Réponses: 2
    Dernier message: 17/03/2007, 18h20
  4. [XSLT] Select sur plusieurs attributs
    Par maitrebn dans le forum XSL/XSLT/XPATH
    Réponses: 1
    Dernier message: 28/11/2006, 13h13
  5. [XSLT]Sort sur un attribut dont la valeur est en param
    Par Trin dans le forum XSL/XSLT/XPATH
    Réponses: 3
    Dernier message: 07/11/2005, 16h16

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