2012-02-22 69 views
9

tengo un nudo en mi archivo XML que contiene el siguiente:XSLT 1.0 Obtener fecha y hora actuales

<Apple>2011-12-01T16:33:33Z</Apple>

deseo aprovechar esta línea y reemplazarla con la fecha y la hora actual utilizando el mismo formato que se muestra encima.

AAAA-MM-DDTHH: MM: SSZ

El nodo está dentro de un espacio de nombres declarados como 'x'

+0

posible duplicar: http://stackoverflow.com/questions/500915/format-a-date-in-xml-via-xslt –

+0

@SivaCharan, no, no es, él está buscando ACTUAL FECHA-HORA en lugar de formato. –

+0

Ver http://stackoverflow.com/questions/5475699/cannot-use-the-current-datetime-function-in-xslt y http://stackoverflow.com/questions/1575111/can-an-xslt-insert- la fecha actual. Si no puede usar XSLT 2.0, use una función de script – StuartLC

Respuesta

11

Jugando con DateTime no es posible con XSLT 1.0 solo .. En situaciones similares que tomé ayuda de secuencias de comandos .. (C#)

XML

muestra:

<?xml version="1.0" encoding="utf-8"?> 
<root> 
    <Apple>2011-12-01T16:33:33Z</Apple> 
</root> 

XSLT muestra:

<?xml version="1.0" encoding="utf-8"?> 
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform" 
    xmlns:msxsl="urn:schemas-microsoft-com:xslt" exclude-result-prefixes="msxsl" xmlns:cs="urn:cs"> 
    <xsl:output method="xml" indent="yes"/> 
    <msxsl:script language="C#" implements-prefix="cs"> 
    <![CDATA[ 
     public string datenow() 
    { 
     return(DateTime.Now.ToString("yyyy'-'MM'-'dd'T'HH':'mm':'ss'Z'")); 
    } 
    ]]> 
    </msxsl:script> 
     <xsl:template match="@* | node()"> 
     <xsl:copy> 
      <xsl:apply-templates select="@* | node()"/> 
     </xsl:copy> 
    </xsl:template> 
    <xsl:template match="Apple"> 
     <xsl:copy> 
     <xsl:value-of select="cs:datenow()"/> 
     </xsl:copy> 
    </xsl:template> 

</xsl:stylesheet> 

salida resultante:

<?xml version="1.0" encoding="utf-8"?> 
<root> 
    <Apple>2012-02-22T18:03:12Z</Apple> 
</root> 

La secuencia de comandos puede residir en un mismo archivo (como lo tengo en mi código XSLT muestra) o si el código de activación XSLTransformation es C# y luego mover el mismo código en el llamado place :)

+0

¡Funcionó perfectamente gracias! – Mike

+0

@Mike, me alegra saber que :) –

+0

Mejoraría la solución pero no tengo suficientes representantes para hacerlo :( – Mike

6

Es mejor pasar el datetime actual de su motor XML. Declare <xsl:param name="current-datetime"/> en su xsl:stylesheet, y pase el valor del procesador.

0

Será mejor que pase los datos actuales como una entrada/xsl: param a la plantilla.

El XSLT pretende ser un lenguaje puramente funcional; es decir, todas las plantillas/funciones deben ajustarse a, p. la siguiente condición: Si se llama a una función pura con parámetros que no causan efectos secundarios, el resultado es constante con respecto a esa lista de parámetros (a veces llamada transparencia referencial), es decir, si la función pura se llama nuevamente con los mismos parámetros, se devolverá el mismo resultado (esto puede permitir optimizaciones del almacenamiento en caché, como la memorización).

Aunque hay soluciones en esto (como InfantPro'Aravind' señaló), no se recomienda hacer este tipo de cosas; al hacerlo, estás arruinando uno de los beneficios más importantes de XSLT.

Cuestiones relacionadas