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

XMLRAD Discussion :

ne peut pas simplement "aXSLProc.Process(aCursor);"


Sujet :

XMLRAD

  1. #1
    Membre confirmé
    Avatar de didier.cabale
    Homme Profil pro
    Conseil - Consultant en systèmes d’information
    Inscrit en
    Août 2004
    Messages
    130
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 61
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Conseil - Consultant en systèmes d’information
    Secteur : Conseil

    Informations forums :
    Inscription : Août 2004
    Messages : 130
    Points : 522
    Points
    522
    Par défaut ne peut pas simplement "aXSLProc.Process(aCursor);"
    [Delphi +TXMLCursor +TXSLProc]

    Bonjour,

    je n'arrive pas à obtenir le résultat souhaité lorsque je veux transformer un TXMLCursor (par aXSLProc.Process(aCursor);). Pour arriver à mes fins, je suis obligé, avant la transformation, de "recharger" mon TXMLCursor avec la méthode "aCursor.LoadXML(aXMLString);"

    pour info, voici mon code source en Delphi:
    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
     
    procedure aProc;
    var
       aDocument,
       aCursor: IXMLCursor;
       XPath: string;
       aXSLProc: IXSLProc;
       s: string;
    begin
       try
       aDocument := TXMLCursor.Create;
       aDocument.Load('test.xml');
       s := aDocument.xml;
       XPath := '//msg[@id=''10'']'; //set whatever path
       aCursor := aDocument.Select(XPath);
       s := aCursor.xml;
    ///////////////////////////////////////////
    /// why need to re-load s into XML ?? ///
    ///////////////////////////////////////////
       aCursor.LoadXML(s);
     
       aXSLProc := TXSLProc.Create;
       aXSLProc.Load('test.xsl');
     
       s := aXSLProc.Process(aCursor);
       finally
          aCursor := nil;
          aDocument := nil;
          aXSLProc := nil;
       end;
    end;
    Quelqu'un obtient-il le même comportement?
    Est-ce là le comportement normal du TXSLProc?
    PS: je tiens à disposition éventuellement les fichiers xml et xsl ayant servi à l'exemple.
    Merci

  2. #2
    Membre actif Avatar de Jeweller
    Inscrit en
    Août 2003
    Messages
    357
    Détails du profil
    Informations forums :
    Inscription : Août 2003
    Messages : 357
    Points : 278
    Points
    278
    Par défaut
    Le xml source peut nous aider.
    Peut etre ta selection ne représente pas qu'un seul élément et du coup le curseur se positionne sur le premier, alors que le texte xml lui représente la totalité. Il me semble que Node et contenu XML peuvent etre différent. Tu pourras vérifier cela en deguggant.
    En résumé c'est peut etre ton xpath qui n'est pas bon ?

    Michael

  3. #3
    Membre confirmé
    Avatar de didier.cabale
    Homme Profil pro
    Conseil - Consultant en systèmes d’information
    Inscrit en
    Août 2004
    Messages
    130
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 61
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Conseil - Consultant en systèmes d’information
    Secteur : Conseil

    Informations forums :
    Inscription : Août 2004
    Messages : 130
    Points : 522
    Points
    522
    Par défaut
    En résumé c'est peut etre ton xpath qui n'est pas bon ?
    Si, il est bon.
    Je précise mon code:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
     
    ...
       aCursor := aDocument.Select(XPath); 
       s := aCursor.xml; //s contient bien le contenu du aCursor
       aCursor.LoadXML(s); // si cette ligne n'est pas rajoutée, le TXSLProc traite le contenu du aDocument, et pas le contenu du aCursor.
     
       aXSLProc := TXSLProc.Create; 
       aXSLProc.Load('test.xsl'); 
     
       s := aXSLProc.Process(aCursor);  
    ....
    Est-ce plus clair?

  4. #4
    Membre actif Avatar de Jeweller
    Inscrit en
    Août 2003
    Messages
    357
    Détails du profil
    Informations forums :
    Inscription : Août 2003
    Messages : 357
    Points : 278
    Points
    278
    Par défaut
    Ce que je veux dire c'est que le select renvoie une reference à un/plusieurs élément(s) dans un document. Le load lui recharge le document comme si il etait neuf. On perd ainsi tous les autres éléments qui ne sont pas dans le scope de la sélection.
    Je pense que le xslproc considère l'ensemble du document et pas simplement les éléments selectionnés.
    Un aCursor.Select('/') avant et apres ton load ne renverra pas du tout la même chose. Du coup si on réfléchi cela devient normal que tu ais à faire le load avant, non ?

    Michael

  5. #5
    Membre actif Avatar de Jeweller
    Inscrit en
    Août 2003
    Messages
    357
    Détails du profil
    Informations forums :
    Inscription : Août 2003
    Messages : 357
    Points : 278
    Points
    278
    Par défaut
    Je viens de te relire... et c'est ce que tu as compris avant moi. Mais moi ca ne me choque pas!

  6. #6
    Membre confirmé
    Avatar de didier.cabale
    Homme Profil pro
    Conseil - Consultant en systèmes d’information
    Inscrit en
    Août 2004
    Messages
    130
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 61
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Conseil - Consultant en systèmes d’information
    Secteur : Conseil

    Informations forums :
    Inscription : Août 2004
    Messages : 130
    Points : 522
    Points
    522
    Par défaut
    Ce que je veux dire c'est que le select renvoie une reference à un/plusieurs élément(s) dans un document. Le load lui recharge le document comme si il etait neuf. On perd ainsi tous les autres éléments qui ne sont pas dans le scope de la sélection.
    Je me demande s'il n'y a pas une confusion. Mon load (TXSLProc.Load) ne concerne pas le TXMLCursor (ressource XML), mais un document XSL.
    Je reviens sur mon pb: ce que je veux dire c'est que le TXSLProc semble ne pas traiter aCursor (cf s := aXSLProc.Process(aCursor);), et ceci bienque aCursor.xml contienne bien le flux xml souhaité. Ce que je constate en revanche c'est que TXSLProc semble traiter le document aDocument. Comme je veux que TXSProc traite aCursor et pas aDocument, j'arrive à mes fins en redéfinissant le contenu de mon TXMLCursor avec un TXMLCorsor.LoadXML(s)
    Est-ce + clair?

  7. #7
    RDM
    RDM est déconnecté
    Membre émérite

    Profil pro
    Inscrit en
    Mars 2002
    Messages
    1 424
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2002
    Messages : 1 424
    Points : 2 927
    Points
    2 927
    Par défaut
    ce que dit Jeweller est correct. le XSLProc travaille sur l'ensemble du document. Alors qu'avec un Select tu positionnes sur un sous-noeud donc ca doit sans doute pas marcher.
    RDM
    Tout Est Relatif
    Rubrique XMLRAD: http://xmlrad.developpez.com
    FAQ XMLRAD: http://xmlrad.developpez.com/faq/

  8. #8
    RDM
    RDM est déconnecté
    Membre émérite

    Profil pro
    Inscrit en
    Mars 2002
    Messages
    1 424
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2002
    Messages : 1 424
    Points : 2 927
    Points
    2 927
    Par défaut
    Citation Envoyé par didier.cabale
    Je me demande s'il n'y a pas une confusion. Mon load (TXSLProc.Load) ne concerne pas le TXMLCursor (ressource XML), mais un document XSL.
    Je reviens sur mon pb: ce que je veux dire c'est que le TXSLProc semble ne pas traiter aCursor (cf s := aXSLProc.Process(aCursor), et ceci bienque aCursor.xml contienne bien le flux xml souhaité. Ce que je constate en revanche c'est que TXSLProc semble traiter le document aDocument. Comme je veux que TXSProc traite aCursor et pas aDocument, j'arrive à mes fins en redéfinissant le contenu de mon TXMLCursor avec un TXMLCorsor.LoadXML(s)
    Est-ce + clair?
    en fait le problème vient de ton Select.
    RDM
    Tout Est Relatif
    Rubrique XMLRAD: http://xmlrad.developpez.com
    FAQ XMLRAD: http://xmlrad.developpez.com/faq/

  9. #9
    Membre confirmé
    Avatar de didier.cabale
    Homme Profil pro
    Conseil - Consultant en systèmes d’information
    Inscrit en
    Août 2004
    Messages
    130
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 61
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Conseil - Consultant en systèmes d’information
    Secteur : Conseil

    Informations forums :
    Inscription : Août 2004
    Messages : 130
    Points : 522
    Points
    522
    Par défaut
    en fait le problème vient de ton Select.
    Alors je pose ma question différemment: Comment transformer (TXSLProc.Process) une sélection ou un fragment de fichier XML?
    Merci

  10. #10
    RDM
    RDM est déconnecté
    Membre émérite

    Profil pro
    Inscrit en
    Mars 2002
    Messages
    1 424
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2002
    Messages : 1 424
    Points : 2 927
    Points
    2 927
    Par défaut
    ah vala ! c'est + clair comme ca

    il faut que tu crées un nouvel XMLCursor et que tu fasses un appendXMLCursor du fragment que tu as sélectionné.
    RDM
    Tout Est Relatif
    Rubrique XMLRAD: http://xmlrad.developpez.com
    FAQ XMLRAD: http://xmlrad.developpez.com/faq/

  11. #11
    Membre actif Avatar de Jeweller
    Inscrit en
    Août 2003
    Messages
    357
    Détails du profil
    Informations forums :
    Inscription : Août 2003
    Messages : 357
    Points : 278
    Points
    278
    Par défaut
    Autrement dit, le aCursor.LoadXML(s) est aussi une solution!
    Et pour répondre à ta question:

    Est-ce là le comportement normal du TXSLProc?
    Oui

    Michael

  12. #12
    Membre confirmé
    Avatar de didier.cabale
    Homme Profil pro
    Conseil - Consultant en systèmes d’information
    Inscrit en
    Août 2004
    Messages
    130
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 61
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Conseil - Consultant en systèmes d’information
    Secteur : Conseil

    Informations forums :
    Inscription : Août 2004
    Messages : 130
    Points : 522
    Points
    522
    Par défaut
    1. en voilà une réponse qu'elle est bonne !!
    2. moralité (pour moi): parfois, il vaut mieux expliquer ce qu'on veut faire au lieu d'aller se perdre dans des explications compliquées et qui peuvent dérouter le lecteur

    Merci pour votre aide à tous!!

  13. #13
    RDM
    RDM est déconnecté
    Membre émérite

    Profil pro
    Inscrit en
    Mars 2002
    Messages
    1 424
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2002
    Messages : 1 424
    Points : 2 927
    Points
    2 927
    Par défaut
    Citation Envoyé par Jeweller
    Autrement dit, le aCursor.LoadXML(s) est aussi une solution!
    en quelque sorte, mais pas la plus rapide: temps de conversion en chaine de caractère avec la methode XML plus temps de parse avec la méthode LoadXML
    RDM
    Tout Est Relatif
    Rubrique XMLRAD: http://xmlrad.developpez.com
    FAQ XMLRAD: http://xmlrad.developpez.com/faq/

  14. #14
    Membre confirmé
    Avatar de didier.cabale
    Homme Profil pro
    Conseil - Consultant en systèmes d’information
    Inscrit en
    Août 2004
    Messages
    130
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 61
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Conseil - Consultant en systèmes d’information
    Secteur : Conseil

    Informations forums :
    Inscription : Août 2004
    Messages : 130
    Points : 522
    Points
    522
    Par défaut
    Bonjour,
    il faut que tu crées un nouvel XMLCursor et que tu fasses un appendXMLCursor du fragment que tu as sélectionné
    Je pensais avoir résolu définitivement mon problème avec la réponse de RDM ci-dessus, mais voilà que XMLCursor retourne une erreur dans le cas où la sélection comprend plusieurs éléments.
    Donc ma question devient: "Comment transformer (par TXSLProc.Process) une sélection qui comprend plusieurs éléments?" Si çà n'est pas possible directement, comment feriez-vous?

    Merci
    Didier

  15. #15
    RDM
    RDM est déconnecté
    Membre émérite

    Profil pro
    Inscrit en
    Mars 2002
    Messages
    1 424
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2002
    Messages : 1 424
    Points : 2 927
    Points
    2 927
    Par défaut
    Citation Envoyé par didier.cabale
    Bonjour,
    il faut que tu crées un nouvel XMLCursor et que tu fasses un appendXMLCursor du fragment que tu as sélectionné
    Je pensais avoir résolu définitivement mon problème avec la réponse de RDM ci-dessus, mais voilà que XMLCursor retourne une erreur dans le cas où la sélection comprend plusieurs éléments.
    Donc ma question devient: "Comment transformer (par TXSLProc.Process) une sélection qui comprend plusieurs éléments?" Si çà n'est pas possible directement, comment feriez-vous?

    Merci
    Didier
    il n'y a normalement pas de problème, donc donne nous plutot ce que tu fais exactement et ce que tu aimerais faire.
    RDM
    Tout Est Relatif
    Rubrique XMLRAD: http://xmlrad.developpez.com
    FAQ XMLRAD: http://xmlrad.developpez.com/faq/

  16. #16
    Membre actif Avatar de Jeweller
    Inscrit en
    Août 2003
    Messages
    357
    Détails du profil
    Informations forums :
    Inscription : Août 2003
    Messages : 357
    Points : 278
    Points
    278
    Par défaut
    La racine d'un document XML ne peut avoir qu'un seul élément. Il faut donc que tu "encapsules" l'ensemble de tes éléments dans un seul avant de l'affecter à un curseur vide. Tu devras peut etre modifier ton xsl.

    Un truc dans ce genre la peut etre:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    Cur := TXMLCursor.create();
    Cur.loadXML('<document/>');
    Cur.Select('/document').AppendXMLCursor(aCursor);
    Michael

  17. #17
    Membre confirmé
    Avatar de didier.cabale
    Homme Profil pro
    Conseil - Consultant en systèmes d’information
    Inscrit en
    Août 2004
    Messages
    130
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 61
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Conseil - Consultant en systèmes d’information
    Secteur : Conseil

    Informations forums :
    Inscription : Août 2004
    Messages : 130
    Points : 522
    Points
    522
    Par défaut
    La racine d'un document XML ne peut avoir qu'un seul élément.
    C'est bien là la réponse.
    Bravo et Merci!!

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

Discussions similaires

  1. listener ne peut pas démarrer
    Par zetta dans le forum Oracle
    Réponses: 15
    Dernier message: 06/10/2005, 13h57
  2. Windows sockets : ne peut pas me connecter au serveur...
    Par kernigansnotdead dans le forum Windows
    Réponses: 13
    Dernier message: 11/09/2005, 16h00
  3. Ubuntu ne peut pas démarrer serveur X
    Par Invité4 dans le forum Applications et environnements graphiques
    Réponses: 8
    Dernier message: 02/07/2005, 15h57
  4. [CR8.5] Ne peut pas insérer de carte dans un rapport
    Par liberio dans le forum SAP Crystal Reports
    Réponses: 5
    Dernier message: 14/06/2004, 22h07
  5. Réponses: 6
    Dernier message: 03/09/2003, 10h29

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