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] DOM en tant que XSL param


Sujet :

XSL/XSLT/XPATH XML

  1. #1
    Membre expérimenté
    Avatar de azerr
    Homme Profil pro
    Ingénieur Etude JEE/Eclipse RCP
    Inscrit en
    Avril 2006
    Messages
    942
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 47
    Localisation : France, Drôme (Rhône Alpes)

    Informations professionnelles :
    Activité : Ingénieur Etude JEE/Eclipse RCP
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Avril 2006
    Messages : 942
    Points : 1 464
    Points
    1 464
    Par défaut [XSLT] DOM en tant que XSL param
    Bonsoir,
    je suis actuellement en train de developper un plugin Eclipse de generation de code qui s'appuie sur XSLT.
    J'aimerais passer à un template XSL un parametre xsl:param qui contient un document XML, puis utiliser ce parametre dans mon template, pour faire ensuite du XPath.

    Plus precisement, j'ai un fichier XML source (Hibernate) :

    <hibernate-mapping>
    ....<property name="name" ...>
    ....<property name="login" ...>

    Mon template XSL doit afficher la liste des elements property de mon fichier XML source (ex : name,login...). Jusqu'ici tout va bien.

    Maintenant j'aimerais passer un DOM en parametre de mon template XSL pour filtrer les property. Je construit une chaine XML :

    <propertiesSelected>
    <propertySelcted name="login" >
    </propertySelected>

    Je le charge dans un Document XML (j'utilise Dom4J) et je le passe a mon processeur XSLT en tant que paramètre

    transformer.setParameter("propertiesSelected", myDOM)
    ou myDOM est org.dom4j.Document

    Dans mon template XSL, j'ai declare le parametre propertiesSelected :
    <xsl:param name="propertiesSelected" />

    puis j'aimerais l'utiliser de la facon suivante pour filtrer mes property de mon fichier XML :

    <xsl:test id="$propertiesSelected/propertySelcted[@name=$currentProperty]" >
    ...affiche la valeur de la property

    (ou $currentProperty est la valeur courant de mon xsl:foreach sur mes property )

    J'ai une erreur du type : 'Conversion incorrecte de 'org.dom4j.tree.DefaultDocument' en 'node-set'.'

    Ma question est comment en XML, passer un document en tant que paramètre XSL? Comment construire un node-set' en Java? Y a t-il une autre solution que celle que je souhaite implementer?

    Je vous remercie de votre aide.

    Angelo

  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
    Bonsoir,

    Plutôt que vouloir passer du DOM comme paramètre, pourquoi ne pas passer que ce qui est réellement utile, à savoir la chaîne ?
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    transformer.setParameter("propertiesSelected", "login")
    En tout état de cause, il va être difficile de passer un node-set au processeur ; il faudrait pour cela que le processeur XSLT expose les classes internes qui implémentent les types de données XPath (Number, NodeSet, Boolean, String), et comme il n'y a rien de normalisé et que la spécification du W3C est muette à ce sujet... Je ne connais que MSXML qui soit capable de prendre en paramètre un fragment DOM.

  3. #3
    Membre expérimenté
    Avatar de azerr
    Homme Profil pro
    Ingénieur Etude JEE/Eclipse RCP
    Inscrit en
    Avril 2006
    Messages
    942
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 47
    Localisation : France, Drôme (Rhône Alpes)

    Informations professionnelles :
    Activité : Ingénieur Etude JEE/Eclipse RCP
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Avril 2006
    Messages : 942
    Points : 1 464
    Points
    1 464
    Par défaut
    Merci GrandFather de ta reponse,

    mon exemple n'etait pas tres pertinent, car plusieurs property peuvent etre selectionnees. Aujourdhui je construis une chaine contenant la liste des property separes par des |

    transformer.setParameter("propertiesSelected", "|login|name|....")

    Puis dans mon template XSL, je fait une recherche sur la chaie |login|
    pour verifier que la property a ete selectionne.
    Je ne trouve pas ma solution très elegante, mais je croies que je vais laisser comme ca. J'ai fouille dans de nombreux forums, tout le monde pose la question, mais personne n'a de reponse.

    transformer.setParameter attend un Object en value, ceci signifie que l'on puisse paser des objets autre que des String, mais quel type d'objets?

    En tout cas merci de ta reponse si rapide.

    Angelo

  4. #4
    Rédacteur

    Avatar de Erwy
    Homme Profil pro
    Développeur Web
    Inscrit en
    Novembre 2003
    Messages
    4 967
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 48
    Localisation : France

    Informations professionnelles :
    Activité : Développeur Web
    Secteur : Administration - Collectivité locale

    Informations forums :
    Inscription : Novembre 2003
    Messages : 4 967
    Points : 10 927
    Points
    10 927
    Par défaut
    Citation Envoyé par GrandFather
    Je ne connais que MSXML qui soit capable de prendre en paramètre un fragment DOM.
    Tu oublis transformix , mais seulement a partir de la version 1.5 de Firefox.
    Il n'y a pas que le processeur xml qui doit supporté ceci, ici par exemple c'est la version de gecko qui pose problème avant

  5. #5
    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
    Citation Envoyé par azerr
    transformer.setParameter attend un Object en value, ceci signifie que l'on puisse paser des objets autre que des String, mais quel type d'objets?
    La JSR de JAXP stipule que c'est le processeur qui se charge de convertir l'objet passé en paramètre, sans préciser aucune règle. Pour répondre à ta question, je ne vois guère d'autre solution que de se plonger dans la doc ou, à défaut, les sources de ton processeur. Pour Xalan, à ce que j'ai pu voir, la conversion se fait systématiquement en String.

    Tu peux explorer 3 autres possibilités :
    • Avec une petite fonction, semblable à celle que tu as déjà écrite, transformer ta chaîne "login|name|..." en variable RTF que tu transformes ensuite en NodeSet avec la fonction node-set(), si ton processeur la supporte
    • Utiliser la fonction str:tokenize() si ton processeur la supporte ; cela te génèrera ton nodeset à partir de ta chaîne avec un code plus concis
    • Si la conversion implicite du paramètre est faite tardivement (au moment où le paramètre est évalué dans une expression XPath), tu peux mettre à profit ce fonctionnement pour écrire une petite extension qui se charge de convertir l'objet passé en paramètre en un objet NodeSet utilisable par le processeur

Discussions similaires

  1. Réponses: 2
    Dernier message: 10/12/2008, 10h53
  2. [XSLT] est ce que xsl génére des espaces blancs?
    Par luna007 dans le forum XSL/XSLT/XPATH
    Réponses: 7
    Dernier message: 02/02/2008, 16h53
  3. [XSLT] Accèder à un noeud via un xsl:param
    Par Gregco dans le forum XSL/XSLT/XPATH
    Réponses: 2
    Dernier message: 30/10/2007, 19h09
  4. [XSLT]Atteindre un node set dans xsl:param
    Par virgul dans le forum XSL/XSLT/XPATH
    Réponses: 4
    Dernier message: 02/10/2006, 11h21
  5. [DROIT] Droits d'auteurs moraux en tant que salariés ?
    Par malotte dans le forum Juridique
    Réponses: 14
    Dernier message: 13/02/2003, 15h56

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