¿Es posible con XSLT para tener un campo de fecha y restar N número de días de ella? Si es así, ¿puedes darme un ejemplo?XSLT - restando días
Respuesta
Aquí es una demostración de cómo hacer esto en XSLT 2.0:
<xsl:stylesheet version="2.0"
xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
xmlns:xs="http://www.w3.org/2001/XMLSchema">
<xsl:output method="text"/>
<xsl:template match="/">
<xsl:variable name="vToday" select="current-date()"/>
Today is: <xsl:sequence select="$vToday"/>
30 days ago it was: <xsl:sequence select=
"$vToday -30*xs:dayTimeDuration('P1D')"/>
365 days ago it was: <xsl:sequence select=
"$vToday -365*xs:dayTimeDuration('P1D')"/>
</xsl:template>
</xsl:stylesheet>
cuando se aplica esta transformación en cualquier documento XML (no se utiliza), el, resultado correcto querido se produce:
Today is: 2010-10-07-07:00
30 days ago it was: 2010-09-07-07:00
365 days ago it was: 2009-10-07-07:00
+1 ¡Buena respuesta! –
FYI ... '
FYI2 ... Incluso con 'version = 2.0' especificado, Chrome 30 produce una página en blanco. Firefox 25 no muestra resultados, sin embargo. – doubleJ
Bueno, XSLT puede dividir cadenas y analizar los números, así que sí, que sería "posible".
Sin embargo, sería mucho más fácil y eficiente si se pudiese utilizar las funciones de extensión y poner en práctica que en otro idioma. Sin embargo, si y cómo funciona eso depende del motor XSLT utilizado.
EXSLT puede tener todo lo que necesita: http://www.exslt.org/date/functions/add/index.html
Sí, con XSLT 2.0 es posible, y muy fácil de hacer.
Hay un montón de Date/Time/Duration functions in XPATH 2.0, que son parte de XSLT 2.0.
En este ejemplo se resta 1 día desde la fecha de 2010-01-01 a 2009-12-31 producir:
<?xml version="1.0"?>
<xsl:stylesheet version="2.0"
xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
xmlns:xs="http://www.w3.org/2001/XMLSchema">
<xsl:template match="/">
<xsl:value-of select="xs:date('2010-01-01') - xs:dayTimeDuration('P1D')" />
</xsl:template>
</xsl:stylesheet>
<xsl:template name="dim" >
<xsl:param name="y" />
<xsl:param name="m"/>
<xsl:choose>
<xsl:when test="($m=1 or $m=3 or $m=5 or $m=7 or $m=8 or $m=10 or $m=12)" >
31
</xsl:when>
<xsl:when test="$m>2">
30
</xsl:when>
<xsl:when test="($m=2) and (not($y mod 4=0)) or ($y mod 100=0) and (not($y mod 400=0))">
28
</xsl:when>
<xsl:otherwise>
29
</xsl:otherwise>
</xsl:choose>
</xsl:template>
<xsl:template name="minusdays">
<xsl:param name="year" />
<xsl:param name="month" />
<xsl:param name="day"/>
<xsl:param name="days"/>
<xsl:variable name="lm" select="number($month)-1+number($month=1)*12"/>
<xsl:variable name="lmdays">
<xsl:call-template name="dim">
<xsl:with-param name="y" select="$year"/>
<xsl:with-param name="m" select="$lm"/>
</xsl:call-template>
</xsl:variable>
<xsl:choose>
<xsl:when test="$days<$day">
<xsl:value-of select="$year"/>
<xsl:if test="number($month)<10">0</xsl:if>
<xsl:value-of select="$month"/>
<xsl:if test="($day - $days)<10">0</xsl:if>
<xsl:value-of select="$day - $days"/>
</xsl:when>
<xsl:otherwise>
<xsl:call-template name="minusdays">
<xsl:with-param name="year"
select="number($year)-number($month=1)"/>
<xsl:with-param name="month" select="$lm" />
<xsl:with-param name="day" select="$lmdays"/>
<xsl:with-param name="days" select="$days - $day" />
</xsl:call-template>
</xsl:otherwise>
</xsl:choose>
</xsl:template>
I puede ver que todas las soluciones mencionadas son para XSLT 2.0. Tengo solución similar para XSLT 1.0 utilizando EXSLT fecha: añadir
Ejemplo: Considere que el número de días que se restará es de 365 y lo necesitamos como la fecha de inicio predeterminada. En este caso, debemos proporcionar la duración 365 días en formato xs: dayTimeDuration, es decir, '-P365D'.
A continuación el código.
<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
xmlns:date="http://exslt.org/dates-and-times"
xmlns:xs="http://www.w3.org/2001/XMLSchema"
extension-element-prefixes="date xs"
exclude-result-prefixes="date xs" version="1.0">
<xsl:output method="xml" version="1.0" encoding="UTF-8" />
<xsl:template match="/">
<xsl:variable name="vCurrDate" select="date:date-time()"/>
<xsl:variable name="vDefaultStDate" select="(date:add($vCurrDate, '-P365D'))"/>
</xsl:template>
</xsl:stylesheet>
Desafortunadamente, muy pocos procesadores XSLT 1.0 son compatibles con EXSLT 'date: add()'. Para una solución puramente XSLT 1.0, sin extensiones, consulte: https://stackoverflow.com/questions/23566734/date-operations-on-xsl-1-0/23569278#23569278 –
- 1. Javascript restando días de la fecha
- 2. Restando un cierto número de horas, días, meses o años a partir de la fecha
- 3. Restando de un 'DateTime'
- 4. Restando de una fecha en VBA?
- 5. Restando el fondo en MATLAB
- 6. resultado extraño cuando se duplica restando
- 7. Restando dos números sin usar el operador '-'
- 8. Restando un arrayList de otro arrayList
- 9. XSLT Transform Efficiency
- 10. XSLT: Creando un Mapa en XSLT
- 11. Actualización de XSLT 1.0 a XSLT 2.0
- 12. ¿Puedo vincular xslt a otro xslt?
- 13. Abstracciones XSLT
- 14. XSLT localización
- 15. XSLT Agrupación
- 16. restando un DateTime de un DateTime en scala
- 17. Restando una fila de datos de otra en SQL
- 18. Bash: restando 10 minutos de un tiempo dado
- 19. SQL - Restando un valor de agotamiento de las filas
- 20. Obtener un DateTime restando segundos desde la fecha actual
- 21. Restando el elemento actual y anterior en una lista
- 22. Calcular el número de días hábiles entre dos días
- 23. Días hábiles en Python
- 24. días Contar por año
- 25. Calcular días del mes
- 26. MySQL SELECT últimos días?
- 27. días Agregando NSDate
- 28. Javascript show milisegundos como días: horas: minutos sin segundos
- 29. XSLT Agrupar hermanos
- 30. Variables dinámicas en XSLT
¿Qué procesador XSLT estás utilizando? –
XSLT 1.0 o XSLT 2.0? ¿Cuál es el formato de fecha? –
Buena pregunta, +1. Vea mi respuesta para una solución completa XSLT 2.0. –