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 :

Transformation XSL avec Xalan : MalformedURIException ?


Sujet :

XSL/XSLT/XPATH XML

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre expérimenté
    Profil pro
    Inscrit en
    Mars 2006
    Messages
    319
    Détails du profil
    Informations personnelles :
    Âge : 44
    Localisation : Belgique

    Informations forums :
    Inscription : Mars 2006
    Messages : 319
    Par défaut Transformation XSL avec Xalan : MalformedURIException ?
    Salut à tous !

    Je suis tombé sur un os et j'ai du mal à m'en sortir tout seul ^^'

    En quelques mots, en espérant qu'ils vous parlent :

    Je développe une applciation web qui, du côté client comme du côté serveur, utilise abondamment XML, et tant qu'à faire XSL. Jusque là je faisais toutes les transformations XSL du côté client à grand coup d'AJAX, dans FireFox comme dans Internet Explorer, et tout allait bien dans le meilleur des monde (*toussote* - sérieusement ça marche bien ).

    Puis j'ai décidé, pour faire un test de performances, de déléguer la tâche à mon serveur. Côté JavaScript ma classe d'encapsulation est utilisée de la même manière sauf qu'elle contacte le serveur pour faire le boulot, ceci à l'aide d'une servlet qui récupère en URL le chemin vers la feuille XSL à utiliser, et les données (XML) via la méthode POST.

    Jusque là rien de bien grave, si ce n'est que Xalan me pond une erreur lors de la transformation, et je ne vois pas pourquoi, et surtout il ne me dit pas grand chose d'éloquant, je ne peux même pas aller dans le code car je n'ai pas de n° de ligne ni rien qui me parle trop... oô

    Ce qui m'interpèle aussi c'est que pour une transformation (plutôt courte) ça marche mais pour une autre (plus grosse) ça ne marche pas. Encore une fois, lorsque les transformations sont faites du côté client par AJAX tout fonctionne bien et les feuilles XSL sont plutôt riches.

    Voici le code de la méthode service de ma servlet que j'ai appelée TransformXML, suivie de l'erreur affichée dans la console ainsi que le message de l'exception :

    / Merci d'avance à ceux qui pourront m'aider, libre à vous de me poser des questions s'il vous manque un élément d'information.

    Cheers !


    ....public void service(HttpServletRequest p_oRequest, HttpServletResponse p_oResponse) throws ServletException, IOException
    ....{
    ........String sStyleSheet = p_oRequest.getParameter("stylesheet");
    ........PrintWriter oOutput = p_oResponse.getWriter();

    ........try
    ........{
    ............String sData = "";
    ............int iDataLength = p_oRequest.getContentLength();
    ............if(iDataLength > 0)
    ............{
    ................BufferedReader oReader = p_oRequest.getReader();
    ................char[] aCharacters = new char[iDataLength];
    ................oReader.read(aCharacters);
    ................sData = new String(aCharacters).trim();
    ............}

    ............if(!sData.equals(""))
    ............{
    ................TransformerFactory oFactory = TransformerFactory.newInstance();
    ................Source oXMLSource = new StreamSource(new StringReader(sData));
    ................Source oXSLSource = new StreamSource(new URL(sStyleSheet).openStream());

    ................p_oResponse.setContentType("text/xml; charset=UTF-8");
    ................oFactory.setURIResolver(Application.getInstance());
    ................Transformer oTransformer = oFactory.newTransformer(oXSLSource);
    // oTransformer.setOutputProperty("method", "xml");
    // oTransformer.setOutputProperty("omit-xml-declaration", "yes");
    ................StringWriter oWriter = new StringWriter();
    ................StreamResult oResult = new StreamResult(oWriter);
    ................oTransformer.transform(oXMLSource, oResult/* new StreamResult(oOutput) */);

    ................System.out.println("¤¤¤" + oWriter.getBuffer() + "¤¤¤");
    ................oOutput.print(oWriter.getBuffer());
    ............}
    ........}
    ........catch(Exception oException)
    ........{
    ............oOutput.write(oException.getMessage());
    ............oException.printStackTrace(oOutput);
    ........}
    ....}


    Exception#printStackTrace() :

    ERREUR : 'javax.xml.transform.TransformerException: com.sun.org.apache.xml.internal.utils.URI$MalformedURIException: Query string contains invalid character:
    '


    Exception#getMessage() :

    com.sun.org.apache.xalan.internal.xsltc.TransletException: javax.xml.transform.TransformerException: com.sun.org.apache.xml.internal.utils.URI$MalformedURIException: Query string contains invalid character: javax.xml.transform.TransformerException: com.sun.org.apache.xalan.internal.xsltc.TransletException: javax.xml.transform.TransformerException: com.sun.org.apache.xml.internal.utils.URI$MalformedURIException: Query string contains invalid character: 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 kanopé.application.servlet.TransformXML.service(TransformXML.java:62) at javax.servlet.http.HttpServlet.service(HttpServlet.java:802)
    [...]

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

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

    à vue de nez le problème viendrait de l'URL de la feuille de style que tu passes en paramètre. Elle serait peut-être mal encodée, ou ne comprendrait pas le protocole (http, file, ...) ...

    Au fait, utilise les balises [code] pour encadrer ton source, la prochaine fois ; ca sera plus lisible et l'indentation et gérée automatiquement.
    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 expérimenté
    Profil pro
    Inscrit en
    Mars 2006
    Messages
    319
    Détails du profil
    Informations personnelles :
    Âge : 44
    Localisation : Belgique

    Informations forums :
    Inscription : Mars 2006
    Messages : 319
    Par défaut
    Salut,

    Merci por le tip de la balise [code] ça va bien m'aider la prochaine fois ^^'

    Autrement, pour ce qui est de la valeur de l'URL ce n'est visiblement pas ça car je l'ai déjà testé et re-testé. J'ai même été lire dans un premier temps ce qu'il y avait au bout de cette URL et j'avais bien le contenu de ma feuille de style.

    J'ai même essayé d'utiliser un StringReader pour lire la source XSL (StreamSource) tout comme pour le XML mais ça ne change rien, même si, sauf erreur de ma part, plus aucun objet URL n'intervient alors en dehors de l'éxecution de la méthode Transformer#transform(Source, Result).

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

    Informations forums :
    Inscription : Mai 2004
    Messages : 4 587
    Par défaut
    Quelle est cette URL ?
    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

  5. #5
    Membre expérimenté
    Profil pro
    Inscrit en
    Mars 2006
    Messages
    319
    Détails du profil
    Informations personnelles :
    Âge : 44
    Localisation : Belgique

    Informations forums :
    Inscription : Mars 2006
    Messages : 319
    Par défaut
    Voici l'URL en question :

    "http://localhost:8080/kanope/resources/templates/administration/usersTree.xsl"

    pointant vers un fichier XSL existant, et visiblement valide/opérationnel car il produit le résultat escompté lorsqu'il est traîté du côté client (MSXML/XSLTProcessor). Cooktop ne me pose aucun problème avec non plus.

  6. #6
    Membre expérimenté
    Profil pro
    Inscrit en
    Mars 2006
    Messages
    319
    Détails du profil
    Informations personnelles :
    Âge : 44
    Localisation : Belgique

    Informations forums :
    Inscription : Mars 2006
    Messages : 319
    Par défaut
    Vraiment pas d'idée ?

  7. #7
    Expert confirmé
    Avatar de GrandFather
    Inscrit en
    Mai 2004
    Messages
    4 587
    Détails du profil
    Informations personnelles :
    Âge : 55

    Informations forums :
    Inscription : Mai 2004
    Messages : 4 587
    Par défaut
    Ce problème d'URI doit être en rapport avec la fonction document(), probablement... Tu n'utiliserais pas un chemin comportant des espaces ?
    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

  8. #8
    Membre expérimenté
    Profil pro
    Inscrit en
    Mars 2006
    Messages
    319
    Détails du profil
    Informations personnelles :
    Âge : 44
    Localisation : Belgique

    Informations forums :
    Inscription : Mars 2006
    Messages : 319
    Par défaut
    J'étais justement en train de contrôler les URLs passées à la fonction document()

    Je suis sur une piste, merci pour ta réponse.

    J'exposerai mon analyse si je trouve une issue au problème bien entendu !

  9. #9
    Membre expérimenté
    Profil pro
    Inscrit en
    Mars 2006
    Messages
    319
    Détails du profil
    Informations personnelles :
    Âge : 44
    Localisation : Belgique

    Informations forums :
    Inscription : Mars 2006
    Messages : 319
    Par défaut
    Ok, alors le problème venait effectivement d'une URL passée à la fonction document(). Seulement XALAN avait la bonne idée de planter *avant* que mon URI resolver ne soit sollicité. Du coup je ne savais pas de quelle URL il me parlait (en disant qu'elle était mal formatée).

    Dans mon fichier XSL j'avais :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
        <xsl:variable name="g_sTranslations"><xsl:value-of select="$g_sContextPath"/>/servlet/GetTranslations?strings=
        id1, id2,
        id3, etc.</xsl:variable>
        <xsl:variable name="g_aI18NStrings" select="document($g_sTranslations, current())/response/data/i18n"/>
    Maintenant je sais que XALAN fait la tête lorsqu'il y a des \n dans l'URL (chose plutôt logique finalement). Par contre Mozilla comme IE ont l'air de s'en balancer car la transformation XSL fonctionne bien du côté client avec AJAX.

    Il ne s'agissait donc pas d'espacements GrandFather mais de retours chariot... pas loin.

    Merci !

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

Discussions similaires

  1. Transformation XSL avec Java
    Par honesttrick dans le forum Développement Web en Java
    Réponses: 6
    Dernier message: 11/11/2014, 15h13
  2. Transformation xsl avec recursif
    Par rafafa87 dans le forum XSL/XSLT/XPATH
    Réponses: 9
    Dernier message: 11/09/2013, 22h11
  3. [SAX] [XSLT] Problème transformation XSL avec SAX et namespace
    Par thierry_b dans le forum Format d'échange (XML, JSON...)
    Réponses: 0
    Dernier message: 17/12/2008, 14h24
  4. [XSLT] transformation xsl avec un fichier xml en utf8
    Par thierry_b dans le forum XSL/XSLT/XPATH
    Réponses: 2
    Dernier message: 08/12/2008, 10h46
  5. [XSLT]Transformer XSL avec du XSL
    Par belibech dans le forum XSL/XSLT/XPATH
    Réponses: 5
    Dernier message: 23/07/2007, 15h18

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