[XML-XSLT] Comment passer la variable date('His')

Eléphanteau du PHP | 11 Messages

06 août 2005, 17:29

Bonjour,

Je souhaiterais passer une variable dans un fichier xsl, en l'occurence la variable date('His') pour l'utiliser dans un xsl:when, comment est-ce possible ? Je vous copie la méthode en php :

Code : Tout sélectionner

$xml = domxml_open_file('Conducteur_2005_07_28_001.xml'); $xsl = domxml_xslt_stylesheet_file('EnEcoute2.xsl'); $html = $xsl->process($xml); echo $html->dump_mem();
et le test en question avec un valeur bidon pour 9h00 :

Code : Tout sélectionner

<xsl:when test="normalize-space(Timing) <= '090000'">
D'avance merci pour votre aide !

h2o
Eléphant du PHP | 81 Messages

06 août 2005, 17:49

Vu dans la doc php4 :
$stylesheet = domxml_xslt_stylesheet_file('/path/to/stylesheet');
$params = array(
   'param1' => 'value1'
   ...
   , 'paramN' => 'valueN' );
$result = $stylesheet->process($document, $params);
php5 :
$proc->setParameter(null, "ok", $ok);
Jean-Marie Hoornaert - h2o
Aide au développement et formation FileMaker, xml et AppleScript

Eléphanteau du PHP | 11 Messages

06 août 2005, 18:06

Merci pour ta réponse rapide ! J'ai donc pris la mèthode pour php 4 et il n'y a pas de message d'erreur (ce qui est nouveau pour moi loll) par contre comment la récupérer et l'utliser dans xsl cette variable ?
EDIT : en fouillant et en tatonant j'ai trouvé ça :

Code : Tout sélectionner

<xsl:param name="heure"/> <xsl:template match="/"> <xsl:value-of select="$heure" />
J'arrive donc a récupérer et à afficher par contre... pour l'intégrer à un test du type xsl:when comment faire ?

h2o
Eléphant du PHP | 81 Messages

06 août 2005, 18:49

Récupérer un paramètre avec valeur par défaut :

Code : Tout sélectionner

<xsl:param name="nomDuParam">valeur par défaut</xsl:param>
Récupérer un paramètre sans valeur par défaut (conseillé)

Code : Tout sélectionner

<xsl:param name="nomDuParam" />
Pour utiliser le paramètre, c'est comme un variable php, le nom, précédé du sigle $

Code : Tout sélectionner

<xsl:choose> <xsl:when test="$nomDuParam = 'vrai'"> <xsl:apply-templates select="article[position() = 1]"/> </xsl:when> <xsl:otherwise> <xsl:apply-templates select="article[position() > 1]"/> </xsl:otherwise> </xsl:choose>
Tu peux avoir plusieurs "when" avant "otherwise"
Jean-Marie Hoornaert - h2o
Aide au développement et formation FileMaker, xml et AppleScript

Eléphanteau du PHP | 11 Messages

06 août 2005, 19:17

Oui je comprends, j'ai donc mis ce code là :

Code : Tout sélectionner

<xsl:when test="Export/Event[translate(normalize-space(Timing),':','') <= '$heure']">

Pour mieux comprendre un extrait du fichier xml :

Code : Tout sélectionner

<Export> <Event> <Timing> <![CDATA[00:00:00]]> </Timing>
Ce que je souhaite faire est évident je pense, trouver la dernière valeur dans le fichier inférieure ou égale à l'heure en cours.
Mais le when n'affiche rien ! et pour cause c'est le otherwhise qui est validé...

h2o
Eléphant du PHP | 81 Messages

06 août 2005, 19:35

Personnellement, j'utilise la même valeur qu'un timestamp php dans un élément ou attribut xml. Si c'est possible, j'utilise les fonctions date de exslt, (http://www.exslt.org/).

Ainsi, j'ai moins de problème pour trouver ce que je cherche.
Jean-Marie Hoornaert - h2o
Aide au développement et formation FileMaker, xml et AppleScript

h2o
Eléphant du PHP | 81 Messages

06 août 2005, 19:42

J'ai été un peu vite

Si tu recherche un événement dont l'heure est plus petit que l'heure recherchée, j'essaierais ceci

Code : Tout sélectionner

<xsl:when test="count(Export/Event[translate(normalize-space(Timing),':','') <= '$heure']) > 0">
Je compte les éléments recherchés. S'il y en a plus que 0, c'est qu'il en a trouvé au moins 1.

[ceci dit de mémoire, sans test]
Jean-Marie Hoornaert - h2o
Aide au développement et formation FileMaker, xml et AppleScript

Eléphanteau du PHP | 11 Messages

06 août 2005, 21:30

Ha hélas ça ne fonctionne pas...

h2o
Eléphant du PHP | 81 Messages

06 août 2005, 23:04

Un peu plus de détails seraient le bienvenus.

Pourquoi ce "choose" - "when". Un "apply-template" avec un xpath reprenant ce que tu présente comme la "condition" du when ne serait-il pas une meilleure solution ?

Difficile à dire sans savoir ce que tu veux faire exactement.
Afficher toutes les "fiches" ou "Timing" < $heure ?
Jean-Marie Hoornaert - h2o
Aide au développement et formation FileMaker, xml et AppleScript

h2o
Eléphant du PHP | 81 Messages

07 août 2005, 11:43

Exemple (plus parlant qu'une longue explication)

le code xml :

Code : Tout sélectionner

<?xml version="1.0" encoding="UTF-8"?> <Export> <Event> <Timing><![CDATA[00:10:00]]></Timing> <Data>Un</Data> </Event> <Event> <Timing><![CDATA[00:20:00]]></Timing> <Data>Deux</Data> </Event> <Event> <Timing><![CDATA[00:30:00]]></Timing> <Data>Trois</Data> </Event> <Event> <Timing><![CDATA[00:40:00]]></Timing> <Data>Quatre</Data> </Event> </Export>
Le code xsl :

Code : Tout sélectionner

<?xml version="1.0" encoding="UTF-8"?> <xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="1.0"> <xsl:param name="heure">002000</xsl:param> <xsl:output method="html" indent="yes"/> <xsl:template match="/"> <xsl:apply-templates select="Export/Event[translate(normalize-space(Timing),':','') <= $heure]"/> </xsl:template> <xsl:template match="Event"> <p> <xsl:value-of select="Data"/> </p> </xsl:template> </xsl:stylesheet>
Le résultat :

Code : Tout sélectionner

<p>Un</p> <p>Deux</p>
résultat variable selon la valeur de $heure.
Jean-Marie Hoornaert - h2o
Aide au développement et formation FileMaker, xml et AppleScript

Eléphanteau du PHP | 11 Messages

08 août 2005, 09:31

Je comprends mieux effectivement l'utilisation d'un when est pas indispensable du tout :lol: Par contre il semble qu'il affiche non pas la dernière valeur inférieure ou égale, mais toutes les valeurs inférieures ou égales ! il manque un "attribut" pour lui spécifier que l'on ne veut qu'une fois la valeur ?
Et autre soucis il semble ne pas afficher les xsl:value-of souhaités mais toutes les valeurs "non-vides"...

h2o
Eléphant du PHP | 81 Messages

08 août 2005, 12:52

Effectif, je n'avais pas fait attention que le dernier était demandé.
Donc, commence par trier "Timing" ascendant et je ne garde que la dernier de ceux qui correspondent aux critères de recherche.

Code : Tout sélectionner

<?xml version="1.0" encoding="UTF-8"?> <xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="1.0"> <xsl:param name="heure">002010</xsl:param> <xsl:output method="html" indent="yes"/> <xsl:template match="/"> <xsl:apply-templates select="Export/Event[translate(normalize-space(Timing),':','') <= $heure]"> <xsl:sort order="ascending" select="Timing"/> </xsl:apply-templates> </xsl:template> <xsl:template match="Event"> <xsl:if test="position()=last()"> <p> <xsl:value-of select="Data"/> </p> </xsl:if> </xsl:template> </xsl:stylesheet>
Jean-Marie Hoornaert - h2o
Aide au développement et formation FileMaker, xml et AppleScript

Eléphanteau du PHP | 11 Messages

08 août 2005, 14:14

Je te suis bien j'ai ce code maintenant dans le fichier xsl :

Code : Tout sélectionner

<?xml version="1.0" encoding="ISO-8859-1"?> <xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"> <xsl:output method="html" indent="yes" encoding="ISO-8859-1"/> <xsl:param name="heure"/> <xsl:template match="/"> <xsl:apply-templates select="Export/Event[translate(normalize-space(Timing),':','') <= $heure and normalize-space(Nat.) = 'Musique']"> <xsl:sort order="ascending" select="Timing"/> </xsl:apply-templates> <xsl:template match="Event"> <xsl:if test="position()=last()"> <p> <xsl:value-of select="Artiste"/> </p> </xsl:if> </xsl:template>
Et un extrait du fichier xml :

Code : Tout sélectionner

<Export> <Event> <Timing> <![CDATA[00:00:00]]> </Timing> <Nat.> <![CDATA[Jingle]]> </Nat.> <Artiste> <![CDATA[Anne Jordan]]> </Artiste> <Titre> <![CDATA[TOPHO24]]> </Titre> ... </Event>
Et hélas il continu a m'afficher la totalité des "champs" pour tous les <event> Qu'est ce que j'ai fait de travers... ? j'ai revérifié plusieurs fois tout :cry:

Eléphanteau du PHP | 11 Messages

08 août 2005, 14:21

Hola ! Autant pour moi !! Simplement mon xsl template qui chevauchait !...
Un énorme merci en tout cas à toi h2o !! Tu es le seul parmis tous les forums qui ai gentillement pris le temps de me répondre ;oD si tu veux voir le résultat en ligne : http://www.pharefm.com/index2.php c'est la parie en haut a gauche du menu de gauche qui est incluse !

h2o
Eléphant du PHP | 81 Messages

08 août 2005, 14:59

Heureux d'avoir pu t'aider. Problème résolu.
Pour vérifier la validité de ton xml, utilise un éditeur spécialisé : ceux-ci vérifient si le code est "bien formé"
Jean-Marie Hoornaert - h2o
Aide au développement et formation FileMaker, xml et AppleScript