Contenu | Rechercher | Menus

Annonce

Si vous avez des soucis pour rester connecté, déconnectez-vous puis reconnectez-vous depuis ce lien en cochant la case
Me connecter automatiquement lors de mes prochaines visites.

À propos de l'équipe du forum.

#1 Le 22/06/2014, à 14:33

Tomzz

[Résolu] Transformation XSL

Bonjour,
Pour les besoins d'un petit truc que je développe ( OSagence ) je cherche à transformer un ficher texte CSV ( Format Poliris, pdf de spécifications ) composé de lignes de 255 champs encadrés de " et séparés par des !# à l'aide d'un fichier XSL ( Le fichier XSL ).
Je souhaiterai pouvoir utiliser ce XSL et d'autres que je créerai, dans un script shell.

J'ai fais quelques recherches et si je crois avoir compris que les fichiers XSL sont un genre de template ou quelque chose de comparable au CSS, je n'arrive pas à trouver comment les utiliser.

Ce que j'aimerai c'est trouver une commande qui permette de faire un truc du genre:

commande /chemin/fichier-entrée.csv /chemin/fichier-xsl.xsl > /chemin/fichier-sortie.xml

J'ai bien trouvé des trucs en PHP, mais je voudrai vraiment trouver quelque chose à utiliser dans un script shell.
Je m'y prend surement mal pour chercher, mais si quelqu'un à une idée, je suis preneur.

Dernière modification par Tomzz (Le 25/06/2014, à 21:51)

Hors ligne

#2 Le 22/06/2014, à 15:40

Zakhar

Re : [Résolu] Transformation XSL

XSL n'est pas vraiment le bon outil pour faire cela !

Si en entrée tu as un CSV (format de merde entre parenthèses), vu de XSL c'est un seul noeud texte... pas vraiment pratique à traiter !

L'idéal, bien sûr, est d'avoir du XML en entrée, ainsi ça devient beaucoup plus pertinent de faire une transformation XSLT.

Sinon pour répondre à ta question tu as :
xerces (pour xslt1.0) ou plus simplement :

$ xsltproc
Le programme 'xsltproc' n'est pas encore installé. Vous pouvez l'installer en tapant :
sudo apt-get install xsltproc

Et si tu veux faire du xslt2.0 : saxon


"A computer is like air conditioning: it becomes useless when you open windows." (Linus Torvald)

Hors ligne

#3 Le 22/06/2014, à 22:51

Tomzz

Re : [Résolu] Transformation XSL

Merci pour ta réponse.
Je viens de tester Saxon sans succès:

saxonb-xslt -ext:on -o:output.xml -xsl:transf.xsl -s:annonces.csv
Warning: at xsl:stylesheet on line 2 column 80 of transf.xsl:
  Running an XSLT 1.0 stylesheet with an XSLT 2.0 processor
Error on line 1 column 1 of annonces.csv:
  SXXP0003: Error reported by XML parser: Content is not allowed in prolog.
Transformation failed: Run-time errors were reported

Je n'ai pas plus de succès avec xsltproc auquel je ne suis pas parvenu à faire prendre le fichier CSV en entrée.
J'ai tenté une pré-conversion du CSV en XML avec konverter csv2xml ça passe mieux, mais je me retrouve avec une flopée erreurs:

test.xml:2: parser error : StartTag: invalid element name

Sans doute dues au fait que les balises XML crées par konverter csv2xml ne correspondent pas à ce qui est attendu dans le ficher XSL

Il faut sans doute que j'explique un peu mieux le truc:
Le fichier CSV créé correspond à un "standard" accepté par de nombreux sites de diffusion d'annonces immobilières.
C'est ce format que j'ai choisi pour base car il est accepté, en France, par la plupart de ces sites, bien que ce ne soit pas leur format natif.

Les fichiers XML sont sans doute plus appropriés, mais là en revanche, chacun à sa petite cuisine personnelle et j'aurai été obligé de créer un fichier différent pour chaque site de diffusion.

Pour une question de temps je suis donc passé par ce format CSV ( nommé Poliris 4.07 ).

Maintenant, pour pouvoir diffuser sur des sites étrangers et sur certains sites français, j'aurai voulu pouvoir créer les fichiers XML adaptés à chaque site en fonction de mon fichier CSV.

J'ai pu récupérer un fichier XSL utilisé par un de ces sites afin de transformer ces fichiers Poliris (CSV) dans le format XML qui leur est propre ( voir le fichier XSL en lien dans le premier post ).

Mon problème, c'est que je me retrouve comme une poule avec une fourchette face à ce fichier XSL.
Si j'en comprend le contenu, je ne sais pas comment l'utiliser pour convertir mon fichier Poliris (CVS).

Hors ligne

#4 Le 22/06/2014, à 23:01

Zakhar

Re : [Résolu] Transformation XSL

C'est sûr que si tu as 0 notion de XSL ça va être dur. tongue

En l'occurrence ton XSL ne FONCTIONNERA PAS avec le CSV en entrée.

Il attend un fichier du type

<Root>
  <advert>
    <Column0>...</Column0>
    <Column1>...</Column1>
(...)
    <Column106>...</Column106>
  </advert>

  <advert>
    <Column0>...</Column0>
    <Column1>...</Column1>
(...)
    <Column106>...</Column106>
  </advert>

(...)
</Root>

Ah oui, et aussi c'est écrit par quelqu'un qui a des notions vraiment basiques de XSL... c'est à dire que c'est écrit comme avec un langage impératif.... c'est pas que ça ne marche pas... mais c'est assez mochissime de faire ainsi. hmm


"A computer is like air conditioning: it becomes useless when you open windows." (Linus Torvald)

Hors ligne

#5 Le 22/06/2014, à 23:24

Tomzz

Re : [Résolu] Transformation XSL

Zankhar a écrit :

C'est sûr que si tu as 0 notion de XSL ça va être dur.

Sans doute, avant de voir ce fichier je ne savais même pas que ça existait roll

Ceci dit:

Il attend un fichier du type .....

c'est ce à quoi je m'attendais en disant ça:

Tomzz a écrit :

Sans doute dues au fait que les balises XML crées par konverter csv2xml ne correspondent pas à ce qui est attendu dans le ficher XSL

Je pense qu'en fait le nommage des balise avec <Column0> <Column1>... correspond en fait au rang du champ correspondant dans le CSV.

Du coup, je me demande si il existe un outil capable de me nommer les balises XML en fonction du rang du champ ou si je dois me débrouiller en traitant le CVS avec du shell pour le transformer en XML avant de la passer par xsltproc et mon XSL.

Pour le reste:

Ah oui, et aussi c'est écrit par quelqu'un qui a des notions vraiment basiques de XSL... c'est à dire que c'est écrit comme avec un langage impératif.... c'est pas que ça ne marche pas... mais c'est assez mochissime de faire ainsi.

Je vais me contenter du fichier que j'ai pour le moment j'approfondirai sans doute plus tard.
Mais juste pour savoir, "c'est à dire que c'est écrit comme avec un langage impératif" ça reste moche même si on sait que le fichier d'entrée est dans un format très figé et sans surprise ou je n'ai pas compris la notion?

Dernière modification par Tomzz (Le 22/06/2014, à 23:25)

Hors ligne

#6 Le 22/06/2014, à 23:38

Zakhar

Re : [Résolu] Transformation XSL

Non, un langage impératif c'est pas exemple C, Java.

Tu as des structures de "contrôle de flot" comme if then else, do while, etc... et précisément tu "contrôles le flot" de façon "impérative" en utilisant lesdites structures.

XSL est tout autre. C'est un langage "déclaratif". Il fonctionne par sélection/application de modèle (template). Tu sélectionnes un ensemble de noeuds, et tu leur appliques un ensemble modèles qui ont pour objet de produire un résultat. En XSLT2.0, c'est même récursif, car tu peux continuer à appliquer d'autres templates en faisant d'autres sélection sur le résultat ainsi produit (pour XSLT1.0 il faut une extension pour faire ça à cause de l'infâme "result tree" sérialisé).
Il existe bien xsl-if, xsl-choose ... mais c'est par commodité, et leur usage révèle d'un mauvais emploi du langage... surtout quand on voit un template unique (qui sélectionne /) et bourré de xsl-if, xsl-choose !
D'ailleurs tu remarqueras qu'on a xsl-if mais pas xsl-else. Le xsl-if n'est donc vraiment qu'un raccourci quand on a un petit truc à faire tout simple plutôt que de rajouter un template (ce qu'on peut toujours faire si on est puriste !).

C'est effectivement très moche d'appeler les données "Column130" etc...
Mais cela est dû à la pauvreté sans nom du CSV, ce format de m..rd... que les gens affectionnent tant !..
Si tes données étaient modélisées "comme il faut" au lieu de s'appeler "Column130" elles s'appelleraient "Type_Habitat".

Ca rend tout de suite les choses beaucoup plus claires quand tu fais un programme, et ça évite les erreurs par "décalage"... genre tu rajoutes une colonne à ton CSV et tu peux tout foutre à la poubelle et recommencer.

Bref, et ce n'est pas ta faute, il semble que tu le subisses... quand les gens arrêteront de ne penser que CSV le monde informatique se portera beaucoup mieux. wink

Dernière modification par Zakhar (Le 22/06/2014, à 23:42)


"A computer is like air conditioning: it becomes useless when you open windows." (Linus Torvald)

Hors ligne

#7 Le 24/06/2014, à 13:54

Tomzz

Re : [Résolu] Transformation XSL

Bonjour,
J'ai un peu avancé, je créé un fichier "base.xml", directement dans mon script, qui ressemble à ça:

<?xml version='1.0' encoding='utf-8' ?>
	<Root>
		<advert>
			<Column0>code_agence</Column0>
			<Column1>00002</Column1>
			<Column2>Vente</Column2>
			<Column3>maison/villa</Column3>
			<Column4>09100</Column4>
			<Column5>PAMIERS</Column5>
			.......
			<Column254></Column254>
		</advert>
	</Root>
</xml>

Puis je lance la commande (fichier transf.xsl en lien dans le premier post:

xsltproc -o "output.xml" "transf.xsl" "base.xml"

Je n'ai plus d'erreur mais je n'obtient qu'un fichier vide de données en sortie:

<?xml version="1.0" encoding="UTF-8"?>
<Envelope>
  <Body>
    <add_adverts/>
  </Body>
</Envelope>

Je suppose qu'il me manque quelque chose dans le fichier "base.xml" mais je ne trouve pas quoi.

Sinon, pour ça:

Zakhar a écrit :

Si tes données étaient modélisées "comme il faut" au lieu de s'appeler "Column130" elles s'appelleraient "Type_Habitat".

Ce n'est peut-être pas un mauvais choix dans la mesure ou ce nommage n'est utilisé que dans le fichier xml intermédiaire entre le fichier Poliris (CSV) et le fichier XML final qui lui va utiliser un nommage de champs différent suivant le site auquel il est destiné.

Hors ligne

#8 Le 24/06/2014, à 18:45

Zakhar

Re : [Résolu] Transformation XSL

Tel que tu le montres, ton fichier XML n'est pas valide.

Correction :

<?xml version='1.0' encoding='utf-8' ?>
<Root>
	<advert>
		<Column0>code_agence</Column0>
		<Column1>00002</Column1>
		<Column2>Vente</Column2>
		<Column3>maison/villa</Column3>
		<Column4>09100</Column4>
		<Column5>PAMIERS</Column5>
		.......
		<Column254></Column254>
	</advert>
</Root>

C'est ça qu'attend ton XSL

Là tu as probablement intercalé un truc entre le noeud document (/) et le premier noeud de l'itération Root/advert
Par conséquent il exécute bien le template /, mais ne trouve aucun Root/advert qui sont fils immédiats de /, et ta sortie contient donc ce qui a été sélectionné : rien !

P.S.: la première ligne du fichier n'est pas un noeud élément ! C'est juste la déclaration obligation du XML et de son encoding.

Dernière modification par Zakhar (Le 24/06/2014, à 18:49)


"A computer is like air conditioning: it becomes useless when you open windows." (Linus Torvald)

Hors ligne

#9 Le 25/06/2014, à 21:55

Tomzz

Re : [Résolu] Transformation XSL

MERCI Zakhar !!!!
Ça marche!!!

Bon, maintenant que ça marche je n'ai plus qu'à comprendre comment big_smile

Enfin comment faire plus proprement, et ça, ça va me prendre du temps.

En tous cas, un grand merci à toi.

Hors ligne

#10 Le 25/06/2014, à 22:35

Zakhar

Re : [Résolu] Transformation XSL

Eh bien vu que tu pars d'un CSV... bon courage pour faire "propre"... "Propre" et "CSV" ça ne va pas vraiment ensemble. tongue

En tout cas, ravi d'avoir pu aider.

J'adore XSL, j'ai même fait une transformation qui résout des sudoku (du "vrai" XSL !), le "coeur" de l'algorithme, celui qui cherche la/les sollutions, fait une 10aine de lignes... et pourtant XSL est super verbeux !


"A computer is like air conditioning: it becomes useless when you open windows." (Linus Torvald)

Hors ligne