Bonjour,
J'ai une application qui reprend un tableau avec des données XML. Voici mon fichier XML:
Comme je désirais n'afficher que les données dont la date 'Départ' n'était pas périmée, je dois comparer cette date Départ avec la date du jour. Pour ce faire, au moment du load de la page, je transforme le fichier XSL avec une méthode qui ajoute à mes données la date du jour et une valeur (0 ou 1) qui m'indique si l'activité est périmée. Et je fais intervenir un XPath pour n'afficher que les bonnes données.
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19 <?xml version="1.0" encoding="utf-8"?> <Activites> <Activite Id="1"> <Nom>WEEK-END DE DETENTE</Nom> <Lieu>Fromelenne</Lieu> <Depart>31/01/2010</Depart> <Retour>02/02/2010</Retour> <Places>8</Places> <Prix>75,00</Prix> </Activite> <Activite Id="2"> <Nom>VACANCES DE CARNAVAL</Nom> <Lieu>Venise</Lieu> <Depart>17/02/2010</Depart> <Retour>25/02/2010</Retour> <Places>8</Places> <Prix>450,00</Prix> </Activite> </Activites>
Voici le code:
Et voici le code du fichier XSL :
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23 public static void TranformerXSLFile(string NomFichierXML, string NomFichierXSL) { string sPath = "MonChemin\\Datas\\"; string sVirtualPath = sPath + NomFichierXSL; // Création du XslCompiledTransform et chargement de la feuille de style. XslCompiledTransform xslt = new XslCompiledTransform(); xslt.Load(sVirtualPath); // Création du XsltArgumentList. XsltArgumentList xslArg = new XsltArgumentList(); // Création du paramètre qui représente la date du jour. DateTime d = DateTime.Now; xslArg.AddParam("date", "", d.ToShortDateString()); // Création du writer. XmlWriterSettings settings = new XmlWriterSettings(); settings.Indent = true; settings.IndentChars = "\t"; XmlWriter writer = XmlWriter.Create(sPath + "output4.xml", settings); // Transformation du fichier. xslt.Transform(sPath + NomFichierXML, xslArg, writer); writer.Close(); xslt.TemporaryFiles.Delete(); }
Seulement, je m'aperçois qu'il n'arrive pas à effectuer une comparaison de date parce que la valeur de $d2 est NaN (NotaNumber). Pourtant l'argumentList envoyé par le XslCompiledTransform est un '.ToShortDateString()'. J'ai essayé avec number($d2) mais cela ne marche pas.
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60 <xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"> <xsl:param name="date"/> <xsl:template match="/"> <xsl:for-each select="Activites"> <xsl:element name="Activites"> <xsl:for-each select="Activite"> <xsl:element name="Activite"> <xsl:attribute name="Id"> <xsl:value-of select="@Id"/> </xsl:attribute> <xsl:attribute name="Nom"> <xsl:value-of select="Nom"/> </xsl:attribute> <xsl:attribute name="Lieu"> <xsl:value-of select="Lieu"/> </xsl:attribute> <xsl:attribute name="Depart"> <xsl:value-of select="Depart"/> </xsl:attribute> <xsl:attribute name="Retour"> <xsl:value-of select="Retour"/> </xsl:attribute> <xsl:attribute name="Places"> <xsl:value-of select="Places"/> </xsl:attribute> <xsl:attribute name="Prix"> <xsl:value-of select="Prix"/> </xsl:attribute> <xsl:attribute name="Date"> <xsl:value-of select="$date"/> </xsl:attribute> <xsl:attribute name="value"> <xsl:variable name="res"> <xsl:call-template name="CompDate"> <xsl:with-param name="date1" select="Depart"/> <xsl:with-param name="date2" select="Date"/> </xsl:call-template> </xsl:variable> <xsl:value-of select="$res"/> </xsl:attribute> </xsl:element> </xsl:for-each> </xsl:element> </xsl:for-each> </xsl:template> <xsl:template name="CompDate"> <xsl:param name="date1"/> <xsl:param name="date2"/> <xsl:variable name="d1" select="number(concat(substring($date1, 7, 4),substring($date1, 4, 2),substring($date1, 1, 2)))"/> <xsl:variable name="d2" select="number(concat(substring($date2, 7, 4),substring($date2, 4, 2),substring($date2, 1, 2)))"/> <xsl:choose> <xsl:when test="$d1>$d2">1</xsl:when> <xsl:when test="$d1<=$d2">0</xsl:when> <xsl:otherwise> <xsl:value-of select="$d2"/> </xsl:otherwise> </xsl:choose> </xsl:template> </xsl:stylesheet>
Une piste ?
Partager