2010-07-21 4 views
1

en utilisant xslt comment puis-je tester si une date était dans le dernier (disons) 15 jours?xslt: il ya un temps test

entrée:

  • date au format jj/mm/aa
  • X nombre de jours

sortie:

  • si la date est survenue dans les X jours maintenant

par exemple récent ('02/07/10' , 30) retournerait vrai ssi 02/07/10 était de 30 jours dans le passé

quelques étapes j'ai obtenu:

principale func

<xsl:function name="custom:monthtodays"> 
    <xsl:param name="date"/> 
    <xsl:param name="daysago"/> 
    <xsl:variable name="daycountnow" select="year-from-dateTime(current-dateTime())*365+day-from-dateTime(current-dateTime())+custom:monthtodays(month-from-dateTime(current-dateTime())" /> 
    <xsl:variable name="datedaycount" select="numeric(substring($date,1,2))+numeric(substring($date,7,2))*365+custom:monthtodays(numeric(substring($date,4,2)))" /> 
    <xsl:value-of select="$daycountnow - $datedaycount - $daysago > 0"/> 
</xsl:function> 

aide func

<xsl:function name="custom:monthtodays"> 
    <xsl:param name="month"/> 
    <xsl:choose> 
     <xsl:when test="$month =1"> <xsl:value-of select="0"/> </xsl:when> 
     <xsl:when test="$month =2"> <xsl:value-of select="31"/> </xsl:when> 
     <xsl:when test="$month =3"> <xsl:value-of select="59"/> </xsl:when> 
     <xsl:when test="$month =4"> <xsl:value-of select="90"/> </xsl:when> 
     <xsl:when test="$month =5"> <xsl:value-of select="120"/> </xsl:when> 
     <xsl:when test="$month =6"> <xsl:value-of select="151"/> </xsl:when> 
     <xsl:when test="$month =7"> <xsl:value-of select="181"/> </xsl:when> 
     <xsl:when test="$month =8"> <xsl:value-of select="212"/> </xsl:when> 
     <xsl:when test="$month =9"> <xsl:value-of select="243"/> </xsl:when> 
     <xsl:when test="$month =10"> <xsl:value-of select="273"/> </xsl:when> 
     <xsl:when test="$month =11"> <xsl:value-of select="304"/> </xsl:when> 
     <xsl:when test="$month =12"> <xsl:value-of select="334"/> </xsl:when> 
    </xsl:choose> 
    </xsl:function> 

mais cela ne prend pas en compte les années bissextiles et autres ... il y a sûrement un Betterway?

+0

xls est l'extension pour Excel Spreadsheets. Je pense que vous voulez dire XSLT, et vous devriez éditer votre publication et vos tags pour corriger cela. –

+0

En outre, vous devez publier des exemples d'entrées et de sorties attendues, ainsi que le code XSL que vous avez essayé. SO n'est pas un endroit où les gens font votre travail (à la maison) pour vous. –

+0

une tentative naïve a été ajoutée ... bonne place sur xls vs xsl. – GreyCloud

Répondre

1

Voici une façon de le faire dans XSLT 1.0. Comme vous utilisez. Net 4.0, vous devriez être disponible pour utiliser la fonction d'extension Microsoft, et écrire votre propre fonction (javascript) pour faire la différence de date.

Voici la transformation.Notez que la fonction JavaScript est assez brut, et assume la date est au format JJ/MM/AA:

<?xml version='1.0'?> 
<xsl:stylesheet version="1.0" 
    xmlns:xsl="http://www.w3.org/1999/XSL/Transform" 
    xmlns:msxsl="urn:schemas-microsoft-com:xslt" 
    xmlns:user="http://mycompany.com/mynamespace"> 

<msxsl:script language="javascript" implements-prefix="user"> 
function datecheck(dateString) 
{ 
    // Get today's date 
    var today = new Date(); 

    // Clear down any time portion 
    today.setHours(0); 
    today.setMinutes(0); 
    today.setSeconds(0); 
    today.setMilliseconds(0); 

    // Length of day in milliseconds 
    var one_day = 1000*60*60*24; 

    // Convert date string into a date 
    var day = parseInt(dateString.substring(0, 2), 10); 
    var month = parseInt(dateString.substr(3, 2), 10); 
    var year = 2000 + parseInt(dateString.substr(6, 2), 10); 
    var date = new Date(year, month - 1, day); 

    // Get date difference 
    var diff = Math.ceil((today.getTime()-date.getTime())/one_day); 
    return (diff &lt;= 30); 
} 
</msxsl:script> 

<xsl:template match="/*"> 
    <xsl:value-of select="user:datecheck(string(.))"/> 
</xsl:template> 

</xsl:stylesheet> 

Lorsque vous appliquez sur cette entrée (aujourd'hui est en supposant 23/07/2010)

<date>02/07/10</date> 

vous devriez obtenir la valeur de retour de vrai

Lorsque vous appliquez sur cette entrée

<date>02/06/10</date> 

Vous devez obtenir la valeur de retour de false

+0

Excellent cela fonctionne (après modifications) bien, mais c'est dommage que .net ! soutien ne marche pas XLST 2.0 Modifications pour le faire fonctionner - en C#: scripts permettent http://msdn.microsoft.com/en-us/library/ms163499.aspx sur le code - tout envelopper dans les msxsl: scripts avec également remplacer le < avec < Merci :) – GreyCloud

1

Cette transformation:

<xsl:stylesheet version="2.0" 
    xmlns:xsl="http://www.w3.org/1999/XSL/Transform" 
    xmlns:xs="http://www.w3.org/2001/XMLSchema" 
    xmlns:my="my:my"> 

    <xsl:output method="text"/> 

    <xsl:template match="/"> 
    <xsl:value-of select="my:isWithinDays(/*, 30)"/> 
    </xsl:template> 

    <xsl:function name="my:isWithinDays" as="xs:boolean"> 
    <xsl:param name="pDate" as="xs:string"/> 
    <xsl:param name="pDaysDuration" as="xs:integer"/> 

    <xsl:variable name="vvalidDate" select= 
    "concat('20', 
      substring($pDate,7), 
      '-', 
      substring($pDate,4,2), 
      '-', 
      substring($pDate,1,2))"/> 

    <xsl:sequence select= 
     "current-date() - xs:date($vvalidDate) 
     le 
     xs:dayTimeDuration(concat('P',$pDaysDuration, 'D'))"/> 
    </xsl:function> 
</xsl:stylesheet> 

lorsqu'il est appliqué sur ce document XML:

<t>02/07/10</t> 

produit le résultat recherché:

true 

Lorsqu'il est appliqué sur ce document XML:

<t>20/06/10</t> 

à nouveau le résultat correct est produit:

false 

Remarque: cette transformation a été réalisée aujourd'hui, 21/07/10.

+0

Pants. Net 4.0 ne semble pas implémenter XSLT 2.0: * (aucun moyen de faire fonctionner cela dans v1.0? – GreyCloud

+0

@GreyCloud: Alors vous ne pouvez utiliser fonctions d'extension Si vous avez utilisé un processeur XSLT 1.0 qui implémente EXSLT (comme Saxon 6.x), vous pouvez jeter un oeil au module XSLT datetime –

Questions connexes