[XSLT] je cherche un master de la xsl !

je cherche un master de la xsl ! [XSLT] - HTML/CSS - Programmation

Marsh Posté le 11-03-2003 à 16:32:19    

salut
je cherche un maitre de la xslt, je dois faire des checks et si c checks en sont pas accomplis, mettre des valeurs par defaut ...
 
par exemple:
 
<fichier>
  <nom>zob.txt</nom>
  <taille>200ko</taille>
</fichier>
 
devrait me donner, disons,
 
  zob.txt ... 200ko
 
mais par exemple:
 
<fichier>
  <nom>zob.txt</nom>
</fichier>
 
devrait me donner, disons,
 
  zob.txt ... taille non specifiee
 
 
 
voila j'ai pensé au <xsl:if> mais je ne sais pas comment materialiser si le noeur <taille> existe ... et je ne crois pas qu'il y aie de <xsl:else>
 
voila j'espere que quelqu'un comprend mon probleme et peut me donner une solution, merci !


---------------
mangez du mozilla c le futur, c votre DESTIN ! http://www.mozilla.org/releases/
Reply

Marsh Posté le 11-03-2003 à 16:32:19   

Reply

Marsh Posté le 11-03-2003 à 17:15:51    

<xsl:for-each select="fichier">
   <xsl:choose>
   <xsl:when test="taille=''">
      <xsl:variable name="lTaille" select="'Taille non sépcifiée'">
   </xsl:when>
   <xsl:otherwise>
      <xsl:variable name="lTaille" select="taille">
   </xsl:otherwise>
   </xsl:choose>
   <xsl:value-of select="nom"/>...<xsl:value-of select="$taille"/><br/>
</xsl:for-each>


 
Pas testé, mais ça doit à peut près être ça/


Message édité par MagicBuzz le 11-03-2003 à 17:16:17
Reply

Marsh Posté le 11-03-2003 à 17:17:42    

Au lieu d'utiliser le xsl:if, je te conseille fortement d'utiliser xsl:when et xsl:otherwise, ça correspond à un "switch" en C, ce qui te permet de tester plusieurs cas différents.

Reply

Marsh Posté le 11-03-2003 à 17:37:15    

Bon, c'est truffé de conneries ce que j'ai écris ;)
 
Code qui marche :
 
test.xml :

<?xml version="1.0"?>
<?xml-stylesheet type="text/xsl" href="test.xsl"?>
<TAIST>
  <fichier>
    <nom>toto.txt</nom>
    <taille>20 Ko</taille>
  </fichier>
  <fichier>
    <nom>titi.txt</nom>
    <taille></taille>
  </fichier>
  <fichier>
    <nom>tata.txt</nom>
  </fichier>
</TAIST>


 
test.xsl :

<?xml version="1.0" encoding="ISO-8859-1"?>
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns:fo="http://www.w3.org/1999/XSL/Format">
<xsl:template match="/TAIST">
<html>
<head>
    <title>TAIST</title>
</head>
<body>
<xsl:for-each select="fichier">
  <xsl:choose>
  <xsl:when test="taille!=''">
     <xsl:value-of select="nom"/>...<xsl:value-of select="taille"/><br/>
  </xsl:when>
  <xsl:otherwise>
     <xsl:value-of select="nom"/>...Non défini<br/>
  </xsl:otherwise>
  </xsl:choose>
</xsl:for-each>
</body>
</html>
</xsl:template>
</xsl:stylesheet>


 
Ca par contre ça marche. Testé avec IE6, mais ça doit marcher aussi avec NS 6 sans et IE 5 sans problème.
 
PS: On ne peux pas tester l'inexistence d'une node. Par contre, on peut tester si elle contient un truc.
 
Donc ='' retournera false si la node n'existe pas.
Il faut donc tester l'inverse : !=''
 
 
Sinon, pour le coup des variables, ça semble plus propre, seulement, XSL c'est de la grosse merde en barre : on ne peux pas réécrire dans une variable déjà définie. Deplus, le scope d'une variable est celui de la node où elle est définie. C'est à dire que si une variable est déclarée dans un xsl:if par exemple, hé bien à la sortie du test, elle n'existe plus.
 
Le XSL c'est pas pour les traîtements complexes... Donc faut pas avoir peur de faire des copier/coller toutes les 5 minutes et dupliquer des kilomètres de code de mise en page à chaque test :/


Message édité par MagicBuzz le 11-03-2003 à 17:45:15
Reply

Marsh Posté le 11-03-2003 à 21:23:22    

hummm... XSL, c'est de la merde quand on sait pas s'en servir...
 

Code :
  1. <xsl:template match="fichier">
  2. <xsl:value-of select="nom" />...<xsl:value-of select="taille[not(.='')]" />
  3. <xsl:if test="not(taille) or taille=''">taille non disponible</xsl:if>
  4. </xsl:template>


 
Si tu veux mon avis, évite le <xsl:for-each...> quand c'est pas utile...

Reply

Marsh Posté le 11-03-2003 à 21:37:13    

MagicBuzz a écrit :

Sinon, pour le coup des variables, ça semble plus propre, seulement, XSL c'est de la grosse merde en barre : on ne peux pas réécrire dans une variable déjà définie. Deplus, le scope d'une variable est celui de la node où elle est définie. C'est à dire que si une variable est déclarée dans un xsl:if par exemple, hé bien à la sortie du test, elle n'existe plus.


 
Comme dans beaucoup de langages déclaratif, ça s'appelle pas une variable mais une valeur qui possède un nom (une let-binding), c'est hyper-méga-courant (le "let" de tous les langages fonctionnels par ex.) et le scoping est syntaxique comme dans un gros paquet de langages (qu'il s'agisse de variables ou de valeurs nommées d'ailleur, et de langages fonctionnels style O'caml ou impératifs comme C).
 
Quand à dire que c'est de la merde en barre, faut simplement se renseigner un peu pour capter le scoping d'une variable.

Reply

Marsh Posté le 11-03-2003 à 21:50:41    

hehehe interesssant comme reponse :)
merci à tous ceux qui ont posté!
 
en fait je me suis servi directement d'uu xsl:choose, comme suit::
 
 


 
                        <xsl:choose>
                                <xsl:when test="./goodresponse">
                                        choiceqcmslide.goodresponse = "<xsl:value-of select="./goodresponse" />";
                                </xsl:when>
                                <xsl:otherwise>
                                        choiceqcmslide.goodresponse = "bonne réponse";
                                </xsl:otherwise>
                        </xsl:choose>
 
 


 
 
avec bien sur le goodresponse = le noeud a tester
 
 
 
edit: petite explication:
 
<xsl:when test="./goodresponse">
 
renvoi le booléen true si le noeud existe et false s'il existe pas ;)


Message édité par k666 le 11-03-2003 à 21:58:19
Reply

Marsh Posté le 11-03-2003 à 22:36:01    

chocoboy a écrit :

hummm... XSL, c'est de la merde quand on sait pas s'en servir...
 

Code :
  1. <xsl:template match="fichier">
  2. <xsl:value-of select="nom" />...<xsl:value-of select="taille[not(.='')]" />
  3. <xsl:if test="not(taille) or taille=''">taille non disponible</xsl:if>
  4. </xsl:template>


 
Si tu veux mon avis, évite le <xsl:for-each...> quand c'est pas utile...


Ca dépends si le mec qui a fait le XML est un goret ou non (et c'est très souvent le cas).
 
Le xsl:template, je m'en sert que pour mettre en forme du code HTML contenu dans une node par exemple, parceque pour traîter les nodes, t'as trop souvent ce genre de chose dans un fichier XML :
 
<a>
  <b></b>
  <c>
    <a></a>
  </c>
</a>
 
Sâchant que la seconde balise "a" ne correspond pas du tout à la même chose que la première.
Ben là, avec ton xsl:template, ça te pète à la figure.
 
Avec le xls:for-each, tu est certain de ne pas rentrer dans l'arborescence.
 
Sinon, pour ce qui est du mot variable, c'est pas moi qui ai inventé le mot-clé "xsl:variable". Une variable, comme son nom l'indique, ça varie. Un point c'est tout.
 
Deplus, j'ai dit que le XSL était de la merde en barre, dans le cadre de traîtements complexes. Si je pensais que c'était de la merde tout court, j'aurais jamais répondu à cette question, j'aurais même pas su, puisque je me serais jamais penché sur le sujet... Faut savoir faire la part des choses un peu.


Message édité par MagicBuzz le 11-03-2003 à 22:36:30
Reply

Marsh Posté le 12-03-2003 à 19:30:33    

...quelle idée aussi de créer des balises qui prêtent à confusion : <a></a> ... faut maîtriser son modèle aussi...
 
sinon, <xsl:variable...> ou

<xsl:param...>

(je préfère d'ailleurs

<xsl:param...>

qui fail la même chose, plus des trucs en plus) peuvent également être déclarés à la racine de ton XSLT et deviennent donc variables globales de ta feuille.
De plus, si tu déclares un variable propre à un noeud, il est possible de la transmettre via <xsl:with-param...>
 
Avec <xsl:for-each...> tu fais du spécifique... bonjour l'évolutivité de ton truc...
 
d'ou ma remarque : si tu utilises pas les bonnes méthodes, le XSLT peut très rapidement devenir inmaintenable et incompréhensible.
 
sinon, un XSLT peut être minuscule et très puissant...


Message édité par chocoboy le 12-03-2003 à 19:38:53
Reply

Marsh Posté le 12-03-2003 à 20:45:41    

chocoboy a écrit :

...quelle idée aussi de créer des balises qui prêtent à confusion : <a></a> ... faut maîtriser son modèle aussi...
 
sinon, <xsl:variable...> ou

<xsl:param...>

(je préfère d'ailleurs

<xsl:param...>

qui fail la même chose, plus des trucs en plus) peuvent également être déclarés à la racine de ton XSLT et deviennent donc variables globales de ta feuille.
De plus, si tu déclares un variable propre à un noeud, il est possible de la transmettre via <xsl:with-param...>
 
Avec <xsl:for-each...> tu fais du spécifique... bonjour l'évolutivité de ton truc...
 
d'ou ma remarque : si tu utilises pas les bonnes méthodes, le XSLT peut très rapidement devenir inmaintenable et incompréhensible.
 
sinon, un XSLT peut être minuscule et très puissant...


Nan, mais le nommage, c'était arbitraire. Moi je parle de la répétition de noms, pas du fait qu'on utilise des mots qui existent dans d'autres normes de déclaration ;)
 
quant à la maintenabilité, moi je trouve bien plus maintenable un code "spécifique" qui fait des for-each qu'un code qui utilise des templates dont on ne maîtrise pas toujours l'application.
 
personnellement, les templates je les utilise que pour les balises de mise en forme HTML, genre <br/> ou <b>...</b>


Message édité par MagicBuzz le 12-03-2003 à 20:50:40
Reply

Marsh Posté le 12-03-2003 à 20:45:41   

Reply

Marsh Posté le 12-03-2003 à 20:48:25    

chocoboy a écrit :


Avec <xsl:for-each...> tu fais du spécifique... bonjour l'évolutivité de ton truc...
 
d'ou ma remarque : si tu utilises pas les bonnes méthodes, le XSLT peut très rapidement devenir inmaintenable et incompréhensible.
 
sinon, un XSLT peut être minuscule et très puissant...


Ben la structure d'un flux XML, normalement, c'est censé être fixe. La norme ISO est très claire à ce sujet. Donc faire du XSL spécifique à la structure du fichier XML n'est pas un mal. Le XML n'est ni plus ni moins qu'un modèle des données, comme dans une base de données. Quand tu commence à y toucher, c'est pas le code qu'il faut revoir, mais l'état mental du gars qui a pondu le modèle, et celle de celui qui y touche.

Reply

Marsh Posté le 13-03-2003 à 19:51:53    

pourquoi pas... pour des traitements très simples alors : comment fais tu quand la profondeur de ton noeud à traiter n'est pas clairement identifiée dans l'arborescence (ce qui m'arrive souvent) : ce qui n'empêche en rien la structure d'être schématisée ?
 
m'enfin, c'est pas grave, si tu n'en vois pas l'utilité, c'est que t'as pas à faire à des cas qui le nécessitent...
 
reste qu'à mon avis, les instructions à utiliser sont dans l'ordre de priorité : <xsl:apply-templates...> puis <xsl:call-template...> et enfin du <xsl:for-each...> dans des cas très spécifiques... je pense réellement qu'utiliser <xsl:for-each...> à tout va enlève une grosse partie de l'intérêt d'XSLT.  (d'ailleurs, je t'avoue que je ne m'en suis servi qu'une fois ou deux)[:chocoboy]

Reply

Marsh Posté le 13-03-2003 à 22:39:52    

connaissez vous des sites, non pas de tutoriaux, mais d'exemples d'applications de xslt hyper pratiques et de bonnes methodes d'utilisations des xslt ? ca m'interesse bcp !

Reply

Marsh Posté le 14-03-2003 à 11:23:10    

:ouch:


---------------
mangez du mozilla c le futur, c votre DESTIN ! http://www.mozilla.org/releases/
Reply

Sujets relatifs:

Leave a Replay

Make sure you enter the(*)required information where indicate.HTML code is not allowed