Page 1 sur 2
[XML-XSLT] Comment passer la variable date('His')
Posté : 06 août 2005, 17:29
par WebServiteur
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 :
D'avance merci pour votre aide !
Posté : 06 août 2005, 17:49
par h2o
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);
Posté : 06 août 2005, 18:06
par WebServiteur
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 ?
Posté : 06 août 2005, 18:49
par h2o
Récupérer un paramètre avec valeur par défaut :
Récupérer un paramètre sans valeur par défaut (conseillé)
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"
Posté : 06 août 2005, 19:17
par WebServiteur
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 :
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é...
Posté : 06 août 2005, 19:35
par h2o
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.
Posté : 06 août 2005, 19:42
par h2o
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]
Posté : 06 août 2005, 21:30
par WebServiteur
Ha hélas ça ne fonctionne pas...
Posté : 06 août 2005, 23:04
par h2o
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 ?
Posté : 07 août 2005, 11:43
par h2o
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 :
résultat variable selon la valeur de $heure.
Posté : 08 août 2005, 09:31
par WebServiteur
Je comprends mieux effectivement l'utilisation d'un when est pas indispensable du tout

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"...
Posté : 08 août 2005, 12:52
par h2o
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>
Posté : 08 août 2005, 14:14
par WebServiteur
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

Posté : 08 août 2005, 14:21
par WebServiteur
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 !
Posté : 08 août 2005, 14:59
par h2o
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é"