¿Hay alguna manera simple de calcular un valor de Weeknumber a partir de un valor de fecha almacenado en XML?Calcular número de semana a partir de un valor de fecha
Tiene que ser una solución XSLT pura. No puedo usar cualquier código :(
programa¿Hay alguna manera simple de calcular un valor de Weeknumber a partir de un valor de fecha almacenado en XML?Calcular número de semana a partir de un valor de fecha
Tiene que ser una solución XSLT pura. No puedo usar cualquier código :(
programaSi puede usar EXSLT, hay several date functions disponibles. Todos ellos se implementan en Saxon, pero si está utilizando MSXSL, Chris Bayes los ha implementado como funciones de extensión, que usted puede colocar dentro de su transformación dentro de un elemento msxsl: script. Sus implementaciones están vinculadas desde cada página de función de fecha específica.
¿Es week-in-year() la función que está buscando?
Editar: comentario de Per JeniT, hay una pure XSLT 1.0 template disponibles en el mismo sitio con la misma funcionalidad que la semana-en-año() (que ella escribió, creo), que podrían ajustarse mejor a sus necesidades.
I en Visual Basic, así que sé cómo hacerlo usando VB.NET. Lea su fecha de XML en una variable (llamémoslo SomeDate). A continuación, la construcción de un nuevo . fecha que sabe es el principio del año que contiene su fecha desconocida Entonces, deja que la función DifFecha haga su trabajo a contar el número de semana
Dim SomeDate As Date = ReadDateFromXML()
Dim YearStart As New Date(Year(SomeDate), 1, 1)
Dim WeekNumber As Integer = DateDiff(DateInterval.WeekOfYear, YearStart, SomeDate)
Tiene que ser una solución XSLT pura. No puedo usar ningún código :( –
Y en C#:.
DateTime date = DateTime.Now;
int week = date.DayOfYear/7;
Console.WriteLine(week);
Tiene que ser una solución XSLT pura. No puedo usar ningún código :( –
Esto es incorrecto ... Eche un vistazo aquí para ver por qué: http://social.msdn.microsoft .com/Foros/en-US/vbgeneral/thread/e38accde-7eaa-462e-95d0-5a47b7dab832/ –
El cálculo de la semana puede ser bastante complicado si siempre quiere que la semana comience el mismo día, porque el primer día del año siempre está cambiando. Existe un estándar ISO para calcularlo, ver this Wikipedia article.
Estoy al tanto de eso, pero no es obligatorio. Todas las semanas pueden comenzar el domingo o el lunes. Solo tengo que calcular el diferencia entre dos fechas (en semanas) –
Eche un vistazo al XSLT Cookbook de Sal Mangano. Curiosamente está disponible en books.google.com http://books.google.com/books?id=su4pWUPWwuEC&pg=PA125&lpg=PA125&dq=xslt+weeknumber&source=web&ots=nBBc3DVJYU&sig=l19cpOhwd9_PqrB72b9CCZk9wUA
El XSLT 2.0 manera es:
<xsl:function name="chkbk:calculate-week-number" as="xs:integer">
<xsl:param name="date" as="xs:date" />
<xsl:sequence select="xs:integer(format-date($date,'[W'))" />
</xsl:function>
Por la forma en 1.0, ver la vista previa caja de cocción. Por cierto, simplemente busqué en Google xslt weeknumber para localizar esto.
¿Puede proporcionarnos una muestra de cómo? dos usan estas funciones, porque parece que me falta algo. Gracias. –
Ir al enlace que agregué y hacer una búsqueda en este libro. Hay un ejemplo completo en la página 143. – NotMe
El formato para la fecha debe ser ''[W]'' (falta el corchete cuadrado en el punto anterior). – JeniT
Se trata de una solución pura de XSLT 1.0:
Uno puede utilizar el módulo datetime_lib.xsl
hoja de estilo por Martin Rowlinson, que viene con el (un IDE XSLT agradable XSelerator, recientemente hizo libremente disponible en SourceForge) Tendrá que descargar e instalar esta aplicación, luego encontrará una gran cantidad de bibliotecas adicionales y muestras de técnicas y soluciones avanzadas.
El archivo datetime_lib.xsl
se puede encontrar (para una instalación típica) en:
C: \ Archivos de programa \ Marrowsoft \ Xselerator25 \ Samples \ Libraries \
De esta biblioteca, aquí está la plantilla llamada "week-number":
<xsl:template name="week-number"> <xsl:param name="year"/> <xsl:param name="month"/> <xsl:param name="day"/> <!-- or --> <xsl:param name="date" select="''"/> <!-- format: yyyymmdd or yyyy-mm-dd --> <!-- or --> <xsl:param name="julian-day" select="''"/> <!-- trim down date --> <xsl:variable name="tdate" select="translate($date,'-','')"/> <!-- decide which params were passed --> <xsl:variable name="yyyy"> <xsl:choose> <xsl:when test="string-length($date) > 0"><xsl:value-of select="substring($tdate,1,4)"/></xsl:when> <xsl:when test="string-length($julian-day) > 0"> <xsl:variable name="jdate"> <xsl:call-template name="julian-day-to-date"> <xsl:with-param name="julian-day" select="$julian-day"/> </xsl:call-template> </xsl:variable> <xsl:value-of select="substring($jdate,1,4)"/> </xsl:when> <xsl:otherwise><xsl:value-of select="$year"/></xsl:otherwise> </xsl:choose> </xsl:variable> <!-- get the julian day number --> <xsl:variable name="jd"> <xsl:choose> <xsl:when test="string-length($julian-day) > 0"><xsl:value-of select="$julian-day"/></xsl:when> <xsl:otherwise> <xsl:call-template name="date-to-julian-day"> <xsl:with-param name="year" select="$year"/> <xsl:with-param name="month" select="$month"/> <xsl:with-param name="day" select="$day"/> <xsl:with-param name="date" select="$date"/> </xsl:call-template> </xsl:otherwise> </xsl:choose> </xsl:variable> <!-- get the julian day number for the first working day of next year --> <xsl:variable name="fyjd"> <xsl:call-template name="first-day-of-year"> <xsl:with-param name="year" select="$yyyy+1"/> <xsl:with-param name="as-julian-day" select="true()"/> </xsl:call-template> </xsl:variable> <!-- decide which the 'working' year for this date is --> <xsl:variable name="start-jd"> <xsl:choose> <xsl:when test="$jd >= $fyjd"><xsl:value-of select="$fyjd"/></xsl:when> <xsl:otherwise> <xsl:call-template name="date-to-julian-day"> <xsl:with-param name="date"> <xsl:call-template name="first-day-of-year"> <xsl:with-param name="year" select="$yyyy"/> </xsl:call-template> </xsl:with-param> </xsl:call-template> </xsl:otherwise> </xsl:choose> </xsl:variable> <!-- final calc output --> <xsl:value-of select="floor(($jd - $start-jd) div 7) + 1"/> </xsl:template>
Aquí es una simple transformación XSLT utilizando el "-número de la semana" plantilla:
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns:msxsl="urn:schemas-microsoft-com:xslt"> <xsl:import href= "C:\Program Files\Marrowsoft\Xselerator25\Samples\Libraries\datetime_lib.xsl"/> <xsl:output method="text"/> <xsl:template match="/"> <xsl:call-template name="week-number"> <xsl:with-param name="date" select="'2008-11-16'"/> </xsl:call-template> </xsl:template> </xsl:stylesheet>
cuando se aplica sobre cualquier documento XML de origen (no se utiliza), la querían resultado se produce:
Espero que esta vez la respuesta haya sido realmente más útil.
Saludos,
Dimitre Novatchev.
El enlace de XSelerator parece desactualizado. Ya no parece estar disponible libremente. ¡Aparte de eso, gran solución, debe ser votado! – Abel
@Abel, Desafortunadamente, Xselerator fue retirado por su autor de sourceforge.net. Si se contacta con él, es posible que le proporcione una licencia permanente: el producto es/aún era gratuito y recuerdo que alguien lo contactó y obtuvo el XSelerator. Por favor, contáctame si necesitas discutir esto. –
Y si mira en ese sitio, encontrará una plantilla XSLT 1.0 pura que lo hará por usted: http://www.exslt.org/date/functions/week-in- año/fecha.week-in-year.template.xsl – JeniT
Así que hay. Me lo perdí. Mejor aún. –
Muchas gracias a los dos. Esta es una implementación muy buena. –