XSLT / XML : position d'un noeud - PHP - Programmation
Marsh Posté le 01-06-2012 à 13:25:54
Citation : si quelqu'un aurait une idée ! ça ne sera pas de refus ! S'il vous plait, bien sur |
Ben imprime déjà les valeurs de position et last dans ton template pour savoir ce qui se passe.
Et mets plutôt test="position()!=last()" dans ton test
Et plutôt que deux xsl:if, utilise un choose when otherwise
<xsl:template name="Recursif">
<xsl:choose>
<xsl:when test="position()!=last()" >,
</xsl:when>
<xsl:otherwise> </xsl:otherwise>
</xsl:choose>
</xsl:template>
A+,
Marsh Posté le 01-06-2012 à 14:00:41
Merci gilou. cependant, ça ne change rien, il ne voit tout de même pas la fin, lorque je suis dans une "eti" . donc j'ai toutjours une virgule, même quand c'est la fin
Marsh Posté le 01-06-2012 à 15:15:43
Heureusement que j'avais mis ça, hein...
Citation : Ben imprime déjà les valeurs de position et last dans ton template pour savoir ce qui se passe. |
Si ça ne marche pas, c'est surement que le node-set que vous passez au template est pas le bon.
Explication:
Quand vous faites
<xsl:template match="champ[@genre='numerique']/eti">
`<xsl:value-of select="concat(../@id,'__',@num)"/>` VALEUR <xsl:call-template name="Recursif"/>
</xsl:template>
votre match va sélectionner un seul eti a la fois pour le passer au template Recursif, alors que ce que vous voulez faire, c'est récupérer la liste des eti dans un noeud champ et avoir une sortie variable selon leur position dans la liste. Pour collecter des noeuds et en faire une liste, on utilise un xsl:for-each avec un select qui convient:
<xsl:template match="champ[@genre='numerique']">
<xsl:for-each select="eti">
`<xsl:value-of select="concat(../@id,'__',@num)"/>` VALEUR <xsl:call-template name="Recursif"/>
</xsl:for-each>
</xsl:template>
Ceci devrait maintenant avoir comme node set la liste des eti dans un champ, de ce fait, les valeurs last et position vont être par rapport à ce node set et ça va coller.
A+,
Marsh Posté le 04-06-2012 à 16:04:13
ReplyMarsh Posté le 04-06-2012 à 16:06:51
Ellia a écrit : Merci beaucoup Gilou ! ça marche nikel !!!! |
Lol, ce que j'avais mis dans le second post quoi...
Marsh Posté le 04-06-2012 à 16:37:17
T'avais pas été assez pédagogique
A+,
Marsh Posté le 04-06-2012 à 17:03:47
Ouais mais finalement, ce que je fais ne marche pas.
En effet, il m'enleve bien la virgule au dernier "eti" mais le soucis c'est qu'il me l'enleve tout le temps. Même quand c'est pas le dernier champ.
Marsh Posté le 04-06-2012 à 19:44:11
Donc ce que tu veux faire n'est pas clair, car j'ai testé sur un exemple:
Code :
|
avec comme script xsl
Code :
|
et saxon comme processeur xsl
"C:\Program Files\Saxonica\SaxonHE9.4N\bin\Transform.exe" -t -s:champs.xml -xsl:champs.xsl -o:out.xml |
et pour moi ça colle en sortie, le premier a bien la virgule attendue:
|
A+,
Marsh Posté le 05-06-2012 à 16:36:26
Voilà, je comprend parfaitement ce que tu viens de faire.
Seulement, il me fait une virgule apres " `Table1__2` VALEUR " , car je ne veux pas qu'il y ait de virgule à la DERNIERE eti, du DERNIER champ !
Et c'est ça que je n'arrive pas à trouver !
Donc si vous avez une idée monsieur Gillou, ou quelqu'un ? ça serait pas de refus!
Marsh Posté le 05-06-2012 à 17:41:20
Ellia a écrit : Voilà, je comprend parfaitement ce que tu viens de faire. |
Il te suffit de changer le sélecteur de ta boucle for, et de la faire partir de plus haut (code non testé):
<xsl:template match="/doc">
<xsl:for-each select=".//eti">
`<xsl:value-of select="concat(../@id,'__',@num)"/>` VALEUR <xsl:call-template name="Recursif"/>
</xsl:for-each>
</xsl:template>
Marsh Posté le 05-06-2012 à 20:24:35
Oui, c'était clair:
<xsl:template match="/doc"> |
ou
<xsl:template match="/"> |
va clairement coller
A+,
Marsh Posté le 08-06-2012 à 10:48:40
Merci à tous pour vos réponses. Cela dit, un soucis persiste.
Mon code arrive bien à retirer la virgule si c'est la derniere 'ETI' du fichier. Cependant, si il me reste un <champ> après cette 'ETI', il me retire tout de même ma virgule ...
Aurez vous une solution pour que lorsque si c'st PAS le dernier "CHAMP" et ben tu me met une virgule.
J'ai pensais à un "if" imbriqué .?
Marsh Posté le 08-06-2012 à 11:40:22
Oui, parce qu'on va pas non plus faire tout ton boulot gratuitement à ta place.
C'est la même technique que celle qu'on vient d'utiliser, en un tout petit peu plus compliqué, il va juste falloir que tu réfléchisse un peu pour comprendre à quel niveau tu démarre ta collecte de noeuds à traiter en une node-list. Ça se fait en 5 mn (c'est le temps que ça m'a pris pour modifier le xsl et tester).
A+,
Marsh Posté le 29-06-2012 à 14:48:16
Re bonjour !!!
Je ré-ouvre le sujet, car un problème persiste !
Code :
|
mon fichier XML ( la fin )
Code :
|
Cependant, lorsque je suis dans le dernier champ, et à la dernière ETI, il me met encore une virgule..
Auriez vous une idée?
Marsh Posté le 29-06-2012 à 15:15:24
Il persiste certainement, puisque tu n'emploies pas les techniques que l'on t'a indiqué auparavant, et qui elles marchent parfaitement.
On t'avait donné ceci comme solution:
Code :
|
Si elle ne te convient pas, donne un exemple de fichier test qui ne marche pas, avec la sortie que tu obtiens et celle que tu voudrais obtenir.
A+,
Marsh Posté le 29-06-2012 à 15:45:30
Non cela ne fontionne pas
D'ailleurs il me zappe mes genre numérique ...
Marsh Posté le 29-06-2012 à 15:49:27
Citation : Si elle ne te convient pas, donne un exemple de fichier test qui ne marche pas, avec la sortie que tu obtiens et celle que tu voudrais obtenir. |
Rhaaa!
A+,
Marsh Posté le 29-06-2012 à 16:03:50
Mon xml :
Code :
|
Mon code XSLT
Code :
|
En sortie
Code :
|
Ce que je voudrais :
Code :
|
Marsh Posté le 29-06-2012 à 16:27:57
Quand je fais ceci sur ton exemple, juste en adaptant les noms de tags et les paths qui ont changé par rapport a ce que tu avais donné auparavant
Code :
|
j'obtiens:
|
J'ai pas traité ton `condition` text , puisque c'est nouveau, ça vient de sortir, et que je ne sais pas ce que tu veux faire avec les champs de genre non num à la base.
A+,
Marsh Posté le 29-06-2012 à 16:43:26
ça ne fonctionne pas du tout chez moi ! C'est pire
ça ne me met pas de virgules dès que c'est la dernière eti du champ. Mais moi je n'en veux pas que quand on est le dernier CHAMP du fichier...
((
Marsh Posté le 29-06-2012 à 17:08:44
Ellia a écrit : ça ne fonctionne pas du tout chez moi ! C'est pire |
Attends, mais ce serait pas le meme post que celui du 05-06-2012 à 16:36:26?
We've gone back in time!
Marsh Posté le 29-06-2012 à 17:29:10
Ellia a écrit : ça ne fonctionne pas du tout chez moi ! C'est pire |
Sur l'exemple que je vous ai donné, ça marche parfaitement avec un processeur xslt standard comme saxon (cf ma sortie en exemple).
le log du processing:
C:\XML>"C:\Program Files\Saxonica\SaxonHE9.4N\bin\Transform.exe" -t -s:champs.xml -xsl:champs.xsl -o:champs.txt |
Si vous utilisez des outils défectueux ou non conformes, je ne peux rien pour vous.
Vous pouvez vérifier sous windows par exemple avec le parser xsl gratuit de microsoft que l'on trouve ici: http://download.cnet.com/Command-L [...] 31054.html
C:\XML>msxsl champs.xml champs.xsl -o champs.txt -t |
Et ça donne exactement le même résultat qu'avec Saxon:
|
Note: mon document xml de test était celui que vous avez fourni, moins la ligne définissant la DTD du document, car je n'y ai pas accès.
A+,
Marsh Posté le 31-05-2012 à 16:02:27
Bonjour à tous,
fisrt time que je poste un message sur un forum, c'est vraiment que j'en ai besoin !
Alors, j'ai un fichier XML qui comprend plusieurs champ : En voici un bout de la structure :
<champ id="Table1" genre="numerique">
<eti num="1">
<titre lang="fr">Oui</titre>
</eti>
</champ>
<champ id="table2" genre="numerique">
<eti num="1">
<titre lang="fr">Oui</titre>
</eti>
</champ>
et donc, dans mon fichier XSL, je veux afficher mes noms de champs accompagnés du "num" de l'étiquette. Je fais donc une concaténation qui fonctionne sans soucis.
Pour traiter ces champs spéciaux ( ceux qui possèdent "une étiquette" ), je les mets dans une boucle :
<xsl:template match="champ[@genre='numerique']/eti">
`<xsl:value-of select="concat(../@id,'__',@num)"/>` VALEUR <xsl:call-template name="Recursif"/>
</xsl:template>
AINSI, vient mon soucis. Je veux qu'à la derniere boucle sur les champs ( TOUS LES CHAMPS ), on me mette un espace blanc, et que si c'est pas le dernier, on me mette une virgule :
<xsl:template name="Recursif">
<xsl:if test = "not(position()=last())">,
</xsl:if><xsl:if test = "position()=last()"> </xsl:if>
</xsl:template>
CEPENDANT, lorsque, je boucle sur (((( <xsl:template match="champ[@genre='numerique']/eti"> )))), et ben il me met tout le temps la virgule, même si c'est le dernier champ !!!!
si quelqu'un aurait une idée ! ça ne sera pas de refus ! S'il vous plait, bien sur
Ellia