Changer nom element et garder les namespaces - XML/XSL - Programmation
Marsh Posté le 18-09-2020 à 11:12:43
Si tu renommes sur place j'aurais tenté un truc tout bête comme ça moi :
Renommer aaa en bbb :
<xsl:template match="aaa"> |
Voire :
<xsl:template match="aaa"> |
Mais bon pas de raison que la première version touche les namespaces je pense.
Marsh Posté le 18-09-2020 à 11:56:41
Ça ne fonctionne pas, voici avec des screens ce que j'obtiens, ce sera peut-être plus clair ? Je m'y suis peut-être mal pris.
La j'ai le namespace où il faut, mais pas d'élement renommé :
La, je n'ai pas le namespace automatiquement ajouté par XSLT :
Le apply-templates ne fonctionne pas du tout ici.
Marsh Posté le 18-09-2020 à 12:10:21
Au lieu de mettre des screenshots d'un cas réel, tu devrais mettre du texte représentant un cas simple de ce que tu veux faire (et qui ne marche pas).
Pour transformer un document xml avec xslt c'est en général mieux d'utiliser d'utiliser <xsl:template match=".... et xsl:apply-templates plutôt que de faire des <xsl:for-each
Exemple de ce que tu pourrais poster :
1. Un morceau d'xml type
Code :
|
Le bout d'xsl qui va avec :
Code :
|
Et ce que tu obtiens en sortie : xsltproc test.xsl test.xml
Code :
|
Marsh Posté le 18-09-2020 à 12:23:42
Xavier_OM a écrit : Au lieu de mettre des screenshots d'un cas réel, tu devrais mettre du texte représentant un cas simple de ce que tu veux faire (et qui ne marche pas). |
Merci pour ton aide, j'ai appris XSLT seul alors je travaille probablement de la mauvaise manière.
Je cherche à prendre un XML entrant, qui correspond à un message A, et à le transformer en message B, avec une structure entièrement différente. Je n'arrive pas à poser le problème avec un cas simple comme tu le demandes. Les exemples simplifiés trouvés sur le net ne répondent pas à ma question.
Marsh Posté le 18-09-2020 à 12:28:16
tahrky a écrit : |
J'ai posté dans mon message précédent le genre de choses qu'il faudrait que tu postes ici pour qu'on comprenne ton problème
Marsh Posté le 18-09-2020 à 13:19:54
Voilà mon fichier XML en entrée simplifié, je laisse l'arborescence pour montrer qu'il y a plusieurs endroits ou on peut trouver les elements.
Code :
|
Voici mon XSLT :
Code :
|
Et voilà ce que je cherche à retrouver à la fin :
Code :
|
J'espère que ce sera plus clair et suffisant . J'aurais du mal à simplifier plus. J'ai laissé le minimum pour comprendre ma situation, en esperant que ce soit suffisant !
Merci beaucoup de tenter de m'aider en tout cas .
Marsh Posté le 18-09-2020 à 14:18:09
Parfait c'est beaucoup plus clair comme ça, je regarde ton xsl et je te dis ce que je trouve.
Marsh Posté le 18-09-2020 à 15:54:55
Un truc comme ça devrait te mettre sur la bonne voie :
Code :
|
Une chose importante sur les namespaces : tous les nœuds héritent des attributs xmlns de leur parents
Donc ces deux choses sont strictement équivalentes :
Code :
|
Ça explique du coup que selon l'endroit où tu vas faire le <xsl-copy-of/> tu verras ou non apparaître les attributs xmlns des nœuds parents ou pas.
Marsh Posté le 18-09-2020 à 16:14:26
Merci pour ton aide, certaines choses sont un peu plus clair dans mon esprit, cependant, je me retrouve avec ça en sortie, ce qui ne fonctionne pas.
Code :
|
c'est objet qui devrait avoir le xmlns:nc1reinforcement="urn:fra:nc1:objet:reinforcement", pas tacticalData. Le XSD de contrôle n'aime pas ça, et je n'arrive pas à remonter d'au moins un niveau l'information.
Merci encore beaucoup pour ton aide .
EDIT : Je peux régler le probleme en faisant une recherche de tous les namespaces dans le fichier, et les recopier comme attribut, je devrais y arriver. Cependant je reste curieux de savoir s'il est possible de faire ce que je cherche à faire ^^.
Merci beaucoup pour ton aide en tout cas.
Marsh Posté le 18-09-2020 à 16:35:16
tahrky a écrit : Merci pour ton aide, certaines choses sont un peu plus clair dans mon esprit, cependant, je me retrouve avec ça en sortie, ce qui ne fonctionne pas.
|
Tu peux peut-être éviter que les namespaces n'apparaissent en mettant copy-namespaces="no" dans la identity rule
Code :
|
vu que c'est elle qui copie tacticalData
Marsh Posté le 18-09-2020 à 19:24:19
Code :
|
Le seul truc un poil coton, c'est que la transfo a tendance a perdre la déclaration du namespace de la valeur d'attribut ou la mettre sur l'élément suivant si on ne le fait pas explicitement à la main.
Testé sous Oxygen. Le Texte/Grille d'une de tes captures d'écran me laisse supposer que c'est ce que tu utilises. Si oui, pourquoi ne pas faire du xsl 3.0, c'est quand même bien plus pratique.
Bon après, tu adaptes si il y a des choses plus paramétrées et simplifiées dans ce que tu fais.
Typiquement j'ai mis <xsl:template match="(reinforcement|unit)[tacticalData]"> mais ça pourrait tout aussi bien être <xsl:template match="*[tacticalData]"> je ne connais pas assez bien tes données pour trancher.
Un exemple de la manière dont j'aurais pu écrire ça en 3.0
Code :
|
tahrky a écrit : Merci pour ton aide, certaines choses sont un peu plus clair dans mon esprit, cependant, je me retrouve avec ça en sortie, ce qui ne fonctionne pas.
|
Pour xmlns:nc1opordain, c'est parce que tu crée object (et toute sa hiérarchie au dessus) comme un nouvel élément, et de ce fait, il n'est pas lié aux namespaces de l'arbre de départ, qu'il ne connait pas. Mais la transformation, elle, elle sait que le namespace nc1opordain a été déclaré dans le contexte de tacticalData (qui lui figurait dans l'arbre de départ) et qu'il ne figure pas dans le contexte des ancêtres de tacticalData en sortie, donc elle fait alors la déclaration, car c'est la première opportunité qu'elle a de le faire. Pour éviter la déclaration du namespace en sortie, il faut faire un copy-namespaces a no, ce qui évitera d'avoir les déclarations de namespaces déclarés dans le contexte d'entrée et pas utilisés dans celui de sortie.
C'est aussi ce qui s'applique pour xmlns:nc1reinforcement et xmlns:nc1unit qui au traitement de tacticalData ont été déclarés dans le contexte d'entrée, mais pas encore dans celui de sortie.
Sur un nouvel élément tel que object ici, il faut directement faire la déclaration du namespace avec xsl:namespace. Et alors le namespace sera déclaré dans le contexte de sortie "au bon moment".
A+,
Marsh Posté le 21-09-2020 à 08:46:23
gilou a écrit :
|
gilou a écrit : Pour xmlns:nc1opordain, c'est parce que tu crée object (et toute sa hiérarchie au dessus) comme un nouvel élément, et de ce fait, il n'est pas lié aux namespaces de l'arbre de départ, qu'il ne connait pas. Mais la transformation, elle, elle sait que le namespace nc1opordain a été déclaré dans le contexte de tacticalData (qui lui figurait dans l'arbre de départ) et qu'il ne figure pas dans le contexte des ancêtres de tacticalData en sortie, donc elle fait alors la déclaration, car c'est la première opportunité qu'elle a de le faire. Pour éviter la déclaration du namespace en sortie, il faut faire un copy-namespaces a no, ce qui évitera d'avoir les déclarations de namespaces déclarés dans le contexte d'entrée et pas utilisés dans celui de sortie. |
Merci beaucoup, c'est plus clair dans ma tête, et j'ai un code qui fonctionne comme je cherchais à le faire ! .
Oui, j'utilise Oxygen, mais en version 16, qui ne permet de faire fonctionner que XSLT2. De toute façon, l'environnement de travail ne supporte pas XSLT3 actuellement, ce qui me restreint beaucoup.
Merci Xavier_OM et Gilou pour votre aide précieuse !
Marsh Posté le 21-09-2020 à 10:11:12
Gilou c'est l'meilleur de toute façon
Marsh Posté le 21-09-2020 à 22:18:01
C'est ce qui me fait bouffer, le xsl.
En me relisant, je vois que je peux écrire cela en 2.0 et un chouia plus fonctionnel :
Code :
|
A+,
Marsh Posté le 22-09-2020 à 09:28:16
J'en ai fait durant 8-12 mois ya 12 ans donc j'avoue c'est pas aussi fluide pour moi
Marsh Posté le 18-09-2020 à 10:54:30
Bonjour à tous,
Je travaille en XSLT, et je souhaite recopier un élément et changer son nom. Sauf que je perds les namespaces (ajouté automatiquement par XSLT) dans la manip.
Dans ce cas là, j'ai bien un élément avec le nouveau nom et le contenu qu'il faut, mais il n'a pas les xlmns nécessaires.
Et là, j'ai bien les namespaces ajoutés automatiquement, mais evidemment pas le bon nom.
Mon problème est que je ne peux pas me permettre d'ajout les namespaces à la main, parce qu'il y en a bien trop. Je cherche donc à automatiser, si quelqu'un serait capable de m'aider .
Merci d'avance.