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 :

[Java] Passe de Node de XSLT à Java


Sujet :

XSL/XSLT/XPATH XML

  1. #1
    Membre du Club
    Profil pro
    Développeur (web, java, php, c, ...)
    Inscrit en
    Février 2006
    Messages
    43
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations professionnelles :
    Activité : Développeur (web, java, php, c, ...)

    Informations forums :
    Inscription : Février 2006
    Messages : 43
    Points : 53
    Points
    53
    Par défaut [Java] Passe de Node de XSLT à Java
    Bonjour,

    J'ai quelques soucis pour transmettre correctement un noeud depuis un XSLT en appelant une fonction Java.

    J'ai dans mon fichier XSLT un appel à une fonction java
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    java:maFonction($monNoeud)
    Bref, rien de bien exceptionnel.

    La fonction java récupère donc un Node, jusque là tout va bien, elle arrive à le lire sans soucis, je peux appeler toutes les méthodes sans problème (getNodeName, etc...), mais quand je veux récupérer un sous-noeud à partir du xpath (via un élément javax.xml.xpath.XPath), là ça me fait une "Erreur inconnue détectée dans XPath", message au combien explicite pour m'aider à résoudre le problème…

    J'ai évidemment testé ma fonction en Java en l'appliquant exactement sur le même noeud, et ça passe nickel. Je suppose donc que l'appel via XSLT doit renvoyer un noeud erroné, mais je vois pas en quoi, vu que je peux accéder à ses pères/fils sans aucun soucis, je comprends pas pourquoi je peux pas exécuter de xpath dessus.

    Si quelqu'un a une explication/solution, je suis donc preneur.

    Je peux aussi contourner le problème si quelqu'un connaît un moyen en XSL-T de renvoyer des paramètres de retour dans un template appelé via un call-template, bref de faire des vrais fonctions. (à savoir que les fonctions EXSLT ne marchent pas dans mon cas, cf sujet posté il y a quelques semaines).

    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,

    quel processeur utilises-tu ? Xalan, Saxon ... ? Et quelle est l'expression XPath qui pose problème ?

  3. #3
    Membre du Club
    Profil pro
    Développeur (web, java, php, c, ...)
    Inscrit en
    Février 2006
    Messages
    43
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations professionnelles :
    Activité : Développeur (web, java, php, c, ...)

    Informations forums :
    Inscription : Février 2006
    Messages : 43
    Points : 53
    Points
    53
    Par défaut
    Xalan, et pour l'expression quoi que je mette ça merde, même avec "."

  4. #4
    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
    AMHA, il faut que tu utilises le moteur XPath implémenté dans Xalan (org.apache.xpath.XPathAPI)...

  5. #5
    Membre du Club
    Profil pro
    Développeur (web, java, php, c, ...)
    Inscrit en
    Février 2006
    Messages
    43
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations professionnelles :
    Activité : Développeur (web, java, php, c, ...)

    Informations forums :
    Inscription : Février 2006
    Messages : 43
    Points : 53
    Points
    53
    Par défaut
    Bon, merci pour tout ça, mais malheureusement, ça n'a pas l'air de suffire, j'ai maintenant un bug encore plus étrange.
    Je récupère donc le XObject avec XPathAPI.eval, de là j'en tire une nodelist, de cette nodelist je sais qu'elle est pas null et qu'elle contient un et un seul élément, et dès que je fais nl.item(0), sans même vouloir faire quoi que ce soit de plus, j'ai droit à une "Erreur : ''" ce qui est toujours aussi parlant.

    Voilà un extrait de la console pour un peu que ça puisse être utile… Mais je me sens un peu perdu là, c'est vraiment des erreurs qu'ont aucune logique. :-/ Comment une NodeList qui contient un élément peut déclencher une erreur simplement en voulant le récupérer ? :-/
    Évidemment encore une fois, en appelant mes fonctions depuis java et non depuis le XSL-T, ça marche…
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    ERREUR :  ''
    Erreur Transformation XSLT
    javax.xml.transform.TransformerException: java.lang.NullPointerException
    	at com.sun.org.apache.xalan.internal.xsltc.trax.TransformerImpl.transform(Unknown Source)
    	at com.sun.org.apache.xalan.internal.xsltc.trax.TransformerImpl.transform(Unknown Source)
    	at xml.hl7.outil.DocumentXML.appliquerXSLT(DocumentXML.java:643)
    	at xml.hl7.outil.DocumentXML.appliquer

  6. #6
    Membre éclairé
    Inscrit en
    Octobre 2005
    Messages
    847
    Détails du profil
    Informations forums :
    Inscription : Octobre 2005
    Messages : 847
    Points : 841
    Points
    841
    Par défaut
    je n'y connais rien, mais es tu sur de ton indice "0" ?
    dans la ligne :


  7. #7
    Membre du Club
    Profil pro
    Développeur (web, java, php, c, ...)
    Inscrit en
    Février 2006
    Messages
    43
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations professionnelles :
    Activité : Développeur (web, java, php, c, ...)

    Informations forums :
    Inscription : Février 2006
    Messages : 43
    Points : 53
    Points
    53
    Par défaut
    Généralement les NodeList ça commence à 0 oui Du reste comme je l'ai dit ça marche parfaitement dans le cas où j'appelle ma fonction depuis Java et non depuis le XSL-T, donc y'a aucun doute possible là dessus.

  8. #8
    Membre éclairé
    Inscrit en
    Octobre 2005
    Messages
    847
    Détails du profil
    Informations forums :
    Inscription : Octobre 2005
    Messages : 847
    Points : 841
    Points
    841
    Par défaut
    ok....j'essaye juste de t'aider...sinon as tu une methode "length" que tu peux appliquer à ton node list...juste pour confirmer qu'elle contien un élément?

    ton "item(param)"....accepte quoi comme type de parametre? (chaine, number, etc....)

    as tu essayer des trucs du genre ?

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    nl.item('0') ou nl.item("0")
    ou meme :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    <xsl:variable name="chaine" select="java:lang.String.new("0")"/>
    nl.item($chaine)

  9. #9
    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
    Comme dans ta question précédente, tu omets de préciser un élément important : tu utilises XSLTC. Plutôt qu'utiliser XPath, as-tu regardé http://xml.apache.org/xalan-j/xsltc/...tml#navigation ?

  10. #10
    Membre du Club
    Profil pro
    Développeur (web, java, php, c, ...)
    Inscrit en
    Février 2006
    Messages
    43
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations professionnelles :
    Activité : Développeur (web, java, php, c, ...)

    Informations forums :
    Inscription : Février 2006
    Messages : 43
    Points : 53
    Points
    53
    Par défaut
    Bon, je vois pas bien en quoi XSLTC change quelque chose ou non à ça, ces explications me parlent pas trop, peut-être par manque de connaissance de ma part, mais cette page à tendance à me parler plutôt chinois.

    Bref, je me suis réécris une fonction à la main pour analyser les xpath, et j'ai peut-être un début d'explication, en voulant le réécrire je m'aperçoit que la méthode getElementByTagname d'un Element (org.w3c....) provoque cette erreur, tandis qu'en parcourant la liste renvoyée par getChildNodes je peux retrouver mon élément fils... Je suppose qu'il peut y'avoir un rapport entre ça et l'analyse des xpath qui foire. Je trouve ça assez hallucinant, et je vois pas bien d'explication logique à ça, si ce n'est que ça ait pu être codé avec les pattes arrière…

    Merci pour ton aide rapide en tous cas, j'ai une solution qui me convient et qui devrait pas causer trop de pertes de performances dans mon cas, mais si quelqu'un a une explication et surtout un moyen de résoudre le problème, je reste preneur.

  11. #11
    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
    Assez bizarre, effectivement. Utilises-tu un espace de nom dans ton XML ?

  12. #12
    Membre du Club
    Profil pro
    Développeur (web, java, php, c, ...)
    Inscrit en
    Février 2006
    Messages
    43
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations professionnelles :
    Activité : Développeur (web, java, php, c, ...)

    Informations forums :
    Inscription : Février 2006
    Messages : 43
    Points : 53
    Points
    53
    Par défaut
    Oui effectivement j'en utilise un, mais bon, c'est toujours la même chose, quand la fonction est appelée depuis une classe Java et non depuis le XSL-T il passe nickel, donc je doute que ça vienne de là, d'autant que quand il y'a un problème avec l'espace de nom généralement ça renvoie pas de résultats, mais de là à planter comme ça… C'est quand même surprenant.

  13. #13
    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
    Il doit y avoir une subtilité dans les différences d'implémentation... As-tu essayé avec getElementByTagnameNS() ?

Discussions similaires

  1. [XSLT] xslt en java
    Par yass dans le forum Format d'échange (XML, JSON...)
    Réponses: 7
    Dernier message: 12/09/2008, 16h41
  2. [XSLT] Problème de transformation XSLT avec JAVA
    Par ploxien dans le forum Format d'échange (XML, JSON...)
    Réponses: 1
    Dernier message: 28/09/2007, 16h47
  3. Librairie java pour parser des expressions XSLT
    Par daytona955 dans le forum Format d'échange (XML, JSON...)
    Réponses: 1
    Dernier message: 26/03/2007, 09h46
  4. [XSLT] java.lang.ArrayIndexOutOfBoundsException sur Transformation XSLT
    Par SONY30 dans le forum Format d'échange (XML, JSON...)
    Réponses: 11
    Dernier message: 11/12/2006, 16h59
  5. Réponses: 4
    Dernier message: 05/10/2005, 18h19

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