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] Utilisation de xsl:key


Sujet :

XSL/XSLT/XPATH XML

  1. #1
    Candidat au Club
    Inscrit en
    Septembre 2007
    Messages
    3
    Détails du profil
    Informations forums :
    Inscription : Septembre 2007
    Messages : 3
    Points : 2
    Points
    2
    Par défaut [XSLT] Utilisation de xsl:key
    Bonjour,

    J'ai un script xsl qui marche bien avec un JDK 1.4 et qui ne marche plus en JDK 1.5. (Je suis un peu perdu dans les versions du moteur de transformation).

    Pour cerner le problème, je l'ai reproduit sur un petit exemple.

    Voici mon document XML :

    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
    <?xml version="1.0" encoding="ISO-8859-1"?>
    <catalog>
      <cd year="1985">
        <title>CD number 1</title>
      </cd>
      <cd year="2006">
        <title>CD number 2</title>
      </cd>
      <cd year="1985">
        <title>CD number 3</title>
      </cd>
      <cd year="2000">
        <title>CD number 4</title>
      </cd>
    </catalog>
    Voici mon script XSL (qui utilise la "méthode MUENCH") :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    <xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"> 
     
    <xsl:key name="y" match="@year" use="."/>  
     
    <xsl:template match="/"> 
     
        <xsl:for-each select="//cd/@year[generate-id(.)=generate-id(key('y', .)[1])]"> 
          <xsl:sort select="." data-type="number"/>
          year:<xsl:value-of select='.'/>
       </xsl:for-each> 
     
    </xsl:template> 
     
    </xsl:stylesheet>
    J'ai aussi un script ant pour faire le travail :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    <?xml version="1.0" encoding="ISO-8859-1"?>
     
    <project name="report" default="report" basedir=".">
    <target name="report">
      <echo message="xslt" />
        <xslt in="catalog.xml" 
              out="report.html"
              style="transfo.xsl"
              force="yes">
        </xslt>
    </target>
    </project>
    Avec un JDK 1.4 j'obtiens bien :
    <?xml version="1.0" encoding="UTF-8"?>

    year:1985
    year:2000
    year:2006
    Mais en java 5 :
    <?xml version="1.0" encoding="UTF-8"?>
    Quelqu'un sait-il pourquoi cette différence ? Comment corriger pour que ça marche dans mes deux environnements ? Et quelle version de moteur j'utilise ?

    Merci beaucoup
    Bernard

  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,

    le XML résultat de la transformation n'est pas bien formé, il manque l'élément "racine". Il est bien possible que le sérialiser de XSLTC qui est fourni avec le JDK 1.5 soit moins permissif que la (vieille) version de Xalan fournie avec le JDK 1.4.

    Produis un XML bien formé, et cela devrait mieux fonctionner...
    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
    Candidat au Club
    Inscrit en
    Septembre 2007
    Messages
    3
    Détails du profil
    Informations forums :
    Inscription : Septembre 2007
    Messages : 3
    Points : 2
    Points
    2
    Par défaut
    Merci pour la réponse, mais je ne vois pas quel xml est mal formé : La balise racine du xml en entrée est <catalog>. Et en sortie, je ne produis pas du xml mais un fichier texte quelconque. Ce n'est pas autorisé ?

    J'ai néanmoins réussi à produire une transformation xsl qui donne le même résultat dans les deux versions. Pour cela, il a fallu que je me situe un cran plus haut dans l'arbre xml. Voici ma nouvelle transformation xsl :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    <xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"> 
     
    <xsl:key name="y" match="cd" use="@year"/>  
     
    <xsl:template match="/"> 
     
        <xsl:for-each select="//cd[generate-id(.)=generate-id(key('y', @year)[1])]"> 
          <xsl:sort select="@year" data-type="number"/>
          year:<xsl:value-of select='@year'/> 
       </xsl:for-each> 
     
    </xsl:template> 
     
    </xsl:stylesheet>
    Cordialement,
    Bernard

Discussions similaires

  1. [XSLT 1.0] problème d'utilisation de xsl:key
    Par ensienne2008 dans le forum XSL/XSLT/XPATH
    Réponses: 1
    Dernier message: 06/04/2011, 15h47
  2. [XSLT] Utilisation de xsl:include ou xsl:import
    Par thierry_b dans le forum XSL/XSLT/XPATH
    Réponses: 2
    Dernier message: 22/05/2009, 10h45
  3. [XSLT] Utilisation de xsl:sort
    Par thierry_b dans le forum XSL/XSLT/XPATH
    Réponses: 2
    Dernier message: 10/03/2009, 09h52
  4. Réponses: 2
    Dernier message: 10/12/2008, 10h53
  5. [XSLT] utilisation de <xsl:call-template>/compteur xsl
    Par ogn dans le forum XSL/XSLT/XPATH
    Réponses: 4
    Dernier message: 05/02/2008, 10h22

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