Précédent   Forum des professionnels en informatique > Webmasters - Développement Web > Outils > XMLRAD
XMLRAD Environnement de développement Web XML/XSL. Avant de poster -> F.A.Q XMLRAD
Partagez cette discussion sur d'autres réseaux sociaux : Viadeo Twitter Google Facebook Digg Delicious MySpace Yahoo
Réponse Proposer ce sujet en actualité
 
Outils de la discussion
Publicité
'
Vieux 15/02/2006, 12h22   #1
Membre régulier
 
Avatar de didier.cabale
 
Homme Didier Cabalé
Conseil - Consultant en systèmes d'information
Inscription : août 2004
Messages : 102
Détails du profil
Informations personnelles :
Nom : Homme Didier Cabalé
Âge : 49
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 : 102
Points : 93
Points : 93
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 :
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
didier.cabale est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 15/02/2006, 14h03   #2
Membre confirmé
 
Avatar de Jeweller
 
Inscription : août 2003
Messages : 354
Détails du profil
Informations forums :
Inscription : août 2003
Messages : 354
Points : 226
Points : 226
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
Jeweller est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 15/02/2006, 14h24   #3
Membre régulier
 
Avatar de didier.cabale
 
Homme Didier Cabalé
Conseil - Consultant en systèmes d'information
Inscription : août 2004
Messages : 102
Détails du profil
Informations personnelles :
Nom : Homme Didier Cabalé
Âge : 49
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 : 102
Points : 93
Points : 93
Citation:
En résumé c'est peut etre ton xpath qui n'est pas bon ?
Si, il est bon.
Je précise mon code:
Code :
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?
didier.cabale est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 15/02/2006, 14h55   #4
Membre confirmé
 
Avatar de Jeweller
 
Inscription : août 2003
Messages : 354
Détails du profil
Informations forums :
Inscription : août 2003
Messages : 354
Points : 226
Points : 226
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
Jeweller est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 15/02/2006, 14h57   #5
Membre confirmé
 
Avatar de Jeweller
 
Inscription : août 2003
Messages : 354
Détails du profil
Informations forums :
Inscription : août 2003
Messages : 354
Points : 226
Points : 226
Je viens de te relire... et c'est ce que tu as compris avant moi. Mais moi ca ne me choque pas!
Jeweller est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 15/02/2006, 15h39   #6
Membre régulier
 
Avatar de didier.cabale
 
Homme Didier Cabalé
Conseil - Consultant en systèmes d'information
Inscription : août 2004
Messages : 102
Détails du profil
Informations personnelles :
Nom : Homme Didier Cabalé
Âge : 49
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 : 102
Points : 93
Points : 93
Citation:
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?
didier.cabale est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 15/02/2006, 15h42   #7
RDM
Membre Expert
 
Inscription : mars 2002
Messages : 1 426
Détails du profil
Informations forums :
Inscription : mars 2002
Messages : 1 426
Points : 1 546
Points : 1 546
Envoyer un message via ICQ à RDM
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/
RDM est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 15/02/2006, 15h43   #8
RDM
Membre Expert
 
Inscription : mars 2002
Messages : 1 426
Détails du profil
Informations forums :
Inscription : mars 2002
Messages : 1 426
Points : 1 546
Points : 1 546
Envoyer un message via ICQ à RDM
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/
RDM est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 15/02/2006, 16h07   #9
Membre régulier
 
Avatar de didier.cabale
 
Homme Didier Cabalé
Conseil - Consultant en systèmes d'information
Inscription : août 2004
Messages : 102
Détails du profil
Informations personnelles :
Nom : Homme Didier Cabalé
Âge : 49
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 : 102
Points : 93
Points : 93
Citation:
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
didier.cabale est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 15/02/2006, 16h11   #10
RDM
Membre Expert
 
Inscription : mars 2002
Messages : 1 426
Détails du profil
Informations forums :
Inscription : mars 2002
Messages : 1 426
Points : 1 546
Points : 1 546
Envoyer un message via ICQ à RDM
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/
RDM est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 15/02/2006, 16h37   #11
Membre confirmé
 
Avatar de Jeweller
 
Inscription : août 2003
Messages : 354
Détails du profil
Informations forums :
Inscription : août 2003
Messages : 354
Points : 226
Points : 226
Autrement dit, le aCursor.LoadXML(s) est aussi une solution!
Et pour répondre à ta question:

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

Michael
Jeweller est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 15/02/2006, 16h42   #12
Membre régulier
 
Avatar de didier.cabale
 
Homme Didier Cabalé
Conseil - Consultant en systèmes d'information
Inscription : août 2004
Messages : 102
Détails du profil
Informations personnelles :
Nom : Homme Didier Cabalé
Âge : 49
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 : 102
Points : 93
Points : 93
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!!
didier.cabale est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 15/02/2006, 17h15   #13
RDM
Membre Expert
 
Inscription : mars 2002
Messages : 1 426
Détails du profil
Informations forums :
Inscription : mars 2002
Messages : 1 426
Points : 1 546
Points : 1 546
Envoyer un message via ICQ à RDM
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/
RDM est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 07/03/2006, 19h39   #14
Membre régulier
 
Avatar de didier.cabale
 
Homme Didier Cabalé
Conseil - Consultant en systèmes d'information
Inscription : août 2004
Messages : 102
Détails du profil
Informations personnelles :
Nom : Homme Didier Cabalé
Âge : 49
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 : 102
Points : 93
Points : 93
Bonjour,
Citation:
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
didier.cabale est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 08/03/2006, 10h06   #15
RDM
Membre Expert
 
Inscription : mars 2002
Messages : 1 426
Détails du profil
Informations forums :
Inscription : mars 2002
Messages : 1 426
Points : 1 546
Points : 1 546
Envoyer un message via ICQ à RDM
Citation:
Envoyé par didier.cabale
Bonjour,
Citation:
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/
RDM est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 08/03/2006, 10h44   #16
Membre confirmé
 
Avatar de Jeweller
 
Inscription : août 2003
Messages : 354
Détails du profil
Informations forums :
Inscription : août 2003
Messages : 354
Points : 226
Points : 226
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 :
1
2
3
Cur := TXMLCursor.create();
Cur.loadXML('<document/>');
Cur.Select('/document').AppendXMLCursor(aCursor);
Michael
Jeweller est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 08/03/2006, 12h25   #17
Membre régulier
 
Avatar de didier.cabale
 
Homme Didier Cabalé
Conseil - Consultant en systèmes d'information
Inscription : août 2004
Messages : 102
Détails du profil
Informations personnelles :
Nom : Homme Didier Cabalé
Âge : 49
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 : 102
Points : 93
Points : 93
Citation:
La racine d'un document XML ne peut avoir qu'un seul élément.
C'est bien là la réponse.
Bravo et Merci!!
didier.cabale est déconnecté   Envoyer un message privé Réponse avec citation 00
Réponse Proposer ce sujet en actualité Cette discussion est résolue.
Outils de la discussion



Fuseau horaire GMT +2. Il est actuellement 10h44.


 
 
 
 
Partenaires

Hébergement Web