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 :

[XSLT] Résultat différent, selon transformation côté client ou serveur


Sujet :

XSL/XSLT/XPATH XML

  1. #1
    Membre éclairé
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Septembre 2006
    Messages
    857
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 45
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Administration - Collectivité locale

    Informations forums :
    Inscription : Septembre 2006
    Messages : 857
    Points : 884
    Points
    884
    Par défaut [XSLT] Résultat différent, selon transformation côté client ou serveur
    Soit le fichier XML suivant

    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
    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
    89
    90
    91
    92
    93
    94
    95
     
    <?xml version="1.0" encoding="ISO-8859-1"?>
    <?xml-stylesheet type="text/xsl" href="file-xsl.xsl"?>
    <root>
            <structure id="0001">
                    <reference>STRUCT0001</reference>
                    <libelle refentite="a" numcreation="b">Structure 1</libelle>
                    <telephone>04-99-61-90-29</telephone>
                    <nombre>0</nombre>
                    <intervenants id="rupture"></intervenants>
                    <adresse>Rue de la république</adresse>
                    <entite></entite>
            </structure>
            <structure id="0002">
                    <reference>STRUCT0002</reference>
                    <libelle>Structure 2</libelle>
                    <telephone>04-99-61-90-25</telephone>
                    <nombre>2</nombre>
                    <intervenants id="rupture">
                      <intervenant>
                        <nom refentite="a" numcreation="b">DUPOND</nom>
                        <prenom>Marcel</prenom>
                      </intervenant>
                      <intervenant>
                        <nom refentite="a" numcreation="b">DURAND</nom>
                        <prenom>Jacques</prenom>
                      </intervenant>
                    </intervenants>
                    <adresse></adresse>
                    <entite></entite>
            </structure>
            <structure id="0003">
                    <reference>STRUCT0003</reference>
                    <libelle>Structure 3</libelle>
                    <telephone>04-99-61-90-20</telephone>
                    <nombre>0</nombre>
                    <intervenants id="rupture"></intervenants>
                    <adresse></adresse>
                    <entite>Mon entité</entite>
            </structure>
            <structure id="0004">
                    <reference>STRUCT0004</reference>
                    <libelle>Structure 4</libelle>
                    <telephone>04-99-61-90-20</telephone>
                    <nombre>0</nombre>
            </structure>
            <structure id="0005">
                    <reference>STRUCT0005</reference>
                    <libelle>Structure 5</libelle>
                    <telephone>04-99-61-90-20</telephone>
                    <nombre>0</nombre>
            </structure>
            <structure id="0006">
                    <reference>STRUCT0006</reference>
                    <libelle>Structure 6</libelle>
                    <telephone>04-99-61-90-20</telephone>
                    <nombre>0</nombre>
            </structure>
            <structure id="0007">
                    <reference>STRUCT0007</reference>
                    <libelle>Structure 7</libelle>
                    <telephone>04-99-61-90-20</telephone>
                    <nombre>0</nombre>
            </structure>
            <structure id="0008">
                    <reference>STRUCT0008</reference>
                    <libelle>Structure 8</libelle>
                    <telephone>04-99-61-90-20</telephone>
                    <nombre>0</nombre>
            </structure>
            <structure id="0009">
                    <reference>STRUCT0009</reference>
                    <libelle>Structure 9</libelle>
                    <telephone>04-99-61-90-20</telephone>
                    <nombre>0</nombre>
            </structure>
            <structure id="00010">
                    <reference>STRUCT00010</reference>
                    <libelle>Structure 10</libelle>
                    <telephone>04-99-61-90-20</telephone>
                    <nombre>0</nombre>
            </structure>
            <structure id="00011">
                    <reference>STRUCT00011</reference>
                    <libelle>Structure 11</libelle>
                    <telephone>04-99-61-90-20</telephone>
                    <nombre>0</nombre>
            </structure>
            <structure id="00012">
                    <reference>STRUCT00012</reference>
                    <libelle>Structure 12</libelle>
                    <telephone>04-99-61-90-20</telephone>
                    <nombre>0</nombre>
            </structure>
    </root>
    auquel j'applique la feuille XSL suivante
    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
    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
    89
    90
    91
    92
     
    <?xml version="1.0" encoding="UTF-8"?>
    <xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
      <!-- Import Entete -->
      <xsl:import href="entete.xsl"/>
      <xsl:output method="html" indent="yes"/>
     
      <!-- Parametres d entrees -->
      <xsl:param name="champTri"/>
      <xsl:param name="sensTri"/>
      <xsl:param name="nbEnregPage"/>
      <xsl:param name="filterKey"/>
      <xsl:param name="filterValue"/>
     
      <!-- Template lien -->
      <xsl:template name="lien">
        <xsl:param name="refEntite"/>
        <xsl:param name="numCreation"/>
        <xsl:param name="item"/>
        <xsl:choose>
          <xsl:when test="$refEntite != '' and $numCreation != ''">
            <td><a href="concat($refEntite,' ',$numCreation)"><xsl:value-of select="."/></a></td>
          </xsl:when>
          <xsl:otherwise>
            <td><xsl:value-of select="."/></td>
          </xsl:otherwise>
        </xsl:choose>
      </xsl:template>
      <!-- Fin Template lien -->
     
      <xsl:template match="root">
      <table>
     
        <!-- Chargement Entete -->
        <xsl:call-template name="entete"/>
     
        <!-- Pour Chaque ligne -->
        <xsl:for-each select="node()[child::*[name()=$filterKey and contains(text(),$filterValue)] and position() &gt; 0 and position() &lt; $nbEnregPage+1]">
          <xsl:sort select="*[name()=$champTri]" order="{$sensTri}"/>
          <xsl:variable name="vRefEntite" select="@refentite"/>
          <xsl:variable name="vNumCreation" select="@numcreation"/>
          <!-- tri -->
          <tr>
          <!-- Colorer une ligne sur 2 -->
          <xsl:if test="(position() mod 2)=0">
            <xsl:attribute name="bgcolor">grey</xsl:attribute>
          </xsl:if>
     
          <!-- Pour chaque colonne -->
          <xsl:for-each select="*">
            <xsl:choose>
              <!-- Si noeud pouvant etre multiple -->
              <xsl:when test="@id='rupture'">
                <xsl:if test="count(*) &gt; 1">
                  <td>
                    <table>
                      <xsl:for-each select="node()">
                        <tr>
                          <td>
                            <xsl:call-template name="lien">
                              <xsl:with-param name="refEntite" select="@refentite"/>
                              <xsl:with-param name="numCreation" select="@numcreation"/>
                              <xsl:with-param name="item" select="."/>
                            </xsl:call-template>
                          </td>
                        </tr>
                      </xsl:for-each>
                    </table>
                  </td>
                </xsl:if>
                <xsl:if test="count(*) &lt; 1">
                <td></td>
                </xsl:if>
              </xsl:when>
              <!-- Sinon appel template lien -->
              <xsl:otherwise>
                <xsl:call-template name="lien">
                  <xsl:with-param name="refEntite" select="@refentite"/>
                  <xsl:with-param name="numCreation" select="@numcreation"/>
                  <xsl:with-param name="item" select="."/>
                </xsl:call-template>
              </xsl:otherwise>
            </xsl:choose>
     
          </xsl:for-each>
          </tr>
        </xsl:for-each>
     
      </table>
      </xsl:template>
     
    </xsl:stylesheet>
    selon que je fasse la transformation côté client via l'exemple fourni sur ce forum ou côté serveur via
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
     
         TransformerFactory tFactory = TransformerFactory.newInstance();
         Transformer transformer = tFactory.newTransformer(new StreamSource(xslt));
     
         transformer.setParameter("champTri","reference");
         transformer.setParameter("sensTri","ascending");
         transformer.setParameter("nbEnregPage","10");
         transformer.setParameter("filterKey","reference");
         transformer.setParameter("filterValue","STRUC");
     
         transformer.transform(new StreamSource(xml),new StreamResult(System.out));
    Je me retrouve avec un résultat différent.
    La transformation côté client me ramène exactement les enregs demandés (10), par contre celle côté serveur me ramène seulement 5 enregs.

    Je ne vois pas d'où peut venir le problème. Si ce n'est de ma feuille XSL qui doit être mal codée...

    Merci d'avance.

  2. #2
    Expert éminent
    Avatar de GrandFather
    Inscrit en
    Mai 2004
    Messages
    4 587
    Détails du profil
    Informations personnelles :
    Âge : 54

    Informations forums :
    Inscription : Mai 2004
    Messages : 4 587
    Points : 7 103
    Points
    7 103
    Par défaut
    Bonjour,

    dans l'hypothèse où tu as fait tes tests avec Internet Explorer pour la transformation côté client, je pense avoir la solution... MSXML (le parseur XML/processeur XSLT de Microsoft) a une tendance à virer les noeuds ne contenant que des blancs, en contradiction avec la spécification. Le compte de noeuds ne doit donc pas être le même selon le processeur utilisé, et dans cette ligne ton filtrage par position() ne rend pas le résultat attendu :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    <xsl:for-each select="node()[child::*[name()=$filterKey and contains(text(),$filterValue)] and position() &gt; 0 and position() &lt; $nbEnregPage+1]">
    Deux solutions possibles :
    1) tu remplaces la ligne que j'ai citée par :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    <xsl:for-each select="*[child::*[name()=$filterKey and contains(text(),$filterValue)] and position() &gt; 0 and position() &lt; $nbEnregPage+1]">
    Ainsi, tu ne prends en compte que les éléments, donc pas de souci avec les noeuds textuels
    2) Tu ajoutes en tête de ta feuille de style :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    <xsl:strip-space elements="*" />
    Tu demandes explicitement à ce que les noeuds textuels ne contenant que des blancs soient supprimés ; tu auras ainsi le même comportement quel que soit le processeur utilisé.
    FAQ XML
    ------------
    « Le moyen le plus sûr de cacher aux autres les limites de son savoir est de ne jamais les dépasser »
    Giacomo Leopardi

  3. #3
    Membre éclairé
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Septembre 2006
    Messages
    857
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 45
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Administration - Collectivité locale

    Informations forums :
    Inscription : Septembre 2006
    Messages : 857
    Points : 884
    Points
    884
    Par défaut
    Effectivement les deux solutions marchent.

    Maintenant je ne comprend pas vraiment... Car tu précises que c'est IE qui a tendance à virer des blancs lors de ses "comptages". Hors là, je voulais les 10 premières structures, et la transformation côté client me ramenait bien les 10 structures, c'est celle côté serveur qui m'en ramenait que 5...
    Peux-tu me dire ce que fait exactement cette ligne ?
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    <xsl:for-each select="*[position() &gt; 0 and position() &lt; $nbEnregPage+1]">
    Elle va bien sélectionner les 10 premiers noeuds <structure> ?

Discussions similaires

  1. [XSLT?][XForms?] Changer la couleur de fond selon la saisie
    Par Leauh dans le forum XSL/XSLT/XPATH
    Réponses: 4
    Dernier message: 04/03/2009, 11h21
  2. [IE][XSLT] n'interprète pas le JS inclus selon la version
    Par cyrill.gremaud dans le forum XSL/XSLT/XPATH
    Réponses: 2
    Dernier message: 16/02/2007, 15h44
  3. [XSLT] Regroupement et tri d'un XML selon un attribut
    Par tatemilio2 dans le forum XSL/XSLT/XPATH
    Réponses: 7
    Dernier message: 25/01/2007, 11h18
  4. [XSLT] Insertion du nom du fichier XML par transformation XSL
    Par stepd dans le forum XSL/XSLT/XPATH
    Réponses: 1
    Dernier message: 11/07/2006, 11h40
  5. [XSLT] Exclure un préfixe de namespace d'une transformation
    Par virgul dans le forum XSL/XSLT/XPATH
    Réponses: 3
    Dernier message: 08/07/2005, 09h00

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