Formatee una fecha en XML a través de XSLT

Cuando uso el serializador XML para serializar un DateTime , está escrito en el siguiente formato:

 2007-11-14T12:01:00 

Al pasar esto a través de una hoja de estilos XSLT para producir HTML, ¿cómo puedo formatear esto? En la mayoría de los casos solo necesito la fecha, y cuando necesito el tiempo, por supuesto, no quiero la “T divertida” allí.

Aquí hay un par de plantillas 1.0 que puede usar:

             

Llámalos con: –

     

y

     

donde xpath es la ruta a un elemento o atributo que tiene el formato de fecha y hora estándar.

El formato de fecha no es fácil en XSLT 1.0. Probablemente la forma más elegante es escribir una función de extensión XSLT corta en C # para el formato de fecha. Aquí hay un ejemplo:

 < ?xml version="1.0" encoding="utf-8"?>    < ![CDATA[ public string FormatDateTime(string xsdDateTime, string format) { DateTime date = DateTime.Parse(xsdDateTime); return date.ToString(format); } ]]>        

Con este documento de entrada

 < ?xml version="1.0" encoding="utf-8"?> 2007-11-14T12:01:00 

conseguirás

 < ?xml version="1.0" encoding="utf-8"?> 14.11.2007 

La función que formatea la fecha toma un valor de fecha como una cadena y un formato como se describe en el método DateTime.ToString . El uso de la estructura DateTime de .NET le permite analizar valores de fecha y hora de XSD arbitrarios (incluidos los especificadores de zona horaria), el cálculo de zona horaria y la salida localizada de forma gratuita.

Sin embargo, tenga en cuenta que hay una advertencia (http://support.microsoft.com/kb/316775) con las extensiones de script msxml: cada vez que carga el XSLT, un ensamblaje que contiene el código del script se genera dinámicamente y se carga en la memoria. Debido al diseño del tiempo de ejecución de .NET, este ensamblaje no se puede descargar. Es por eso que debe asegurarse de que su XSLT solo se cargue una vez (y luego se almacena en caché para su posterior reutilización). Esto es especialmente importante cuando se ejecuta dentro de IIS.

John Workman analiza este tema detenidamente y ofrece varias soluciones en esta discusión [1] en su blog. Básicamente, analiza los componentes de fecha individuales y recombínalos en el orden que desees. Para su caso, una versión XSLT 1.0+ pura sería:

 < ?xml version="1.0" encoding="utf-8"?>                                   

Otro formato (REEMPLAZA la sección FORMATO EUROPEO):

   January February March April May June July August September October November December             

Puedes recombinar los elementos de la forma que elijas.

[1] http://geekswithblogs.net/workdog/archive/2007/02/08/105858.aspx @@ http://archive.is/4Hjep

Disculpas por comentar sobre este viejo hilo, pero para otros encontrarlo como yo también puedes usar javascript si estás usando un transformador MS:

Declarar el espacio de nombres “msxsl”:

 xmlns:msxsl="urn:schemas-microsoft-com:xslt" 

Declara un espacio de nombre para tu script:

 xmlns:js="urn:custom-javascript" 

(Opcional) Omita los prefijos de la salida:

 exclude-result-prefixes="msxsl js" 

Entonces terminas con una statement xsl como esta:

  

Escriba el JavaScript en el elemento script msxsl:

  < ![CDATA[ function javascriptFunction(dateValue){ var date = new Date(dateValue); if(!isNaN(date)) return date.toLocaleString(); return dateValue; } ]]>  

Llame a su función JavaScript (usando la syntax XPath ‘.’ Que denota ‘este nodo’):

  

NB: A partir de la redacción, no parece haber una forma (xsl) de incluir archivos js externos (por ejemplo, la biblioteca jquery). Esto podría hacerse analizando el lado del servidor de archivos xsl antes de la transformación y agregando el contenido del archivo js como una cadena en una sección CDATA. Comencé a tomar esta ruta yo mismo, pero concluí que si necesita este nivel de funcionalidad, podría estar mejor ubicado en una parte diferente de la tubería.

fuente: http://dev.ektron.com/kb_article.aspx?id=482
ref: http://www.ibm.com/developerworks/xml/library/x-tipxsltjs/index.html

corrección a la publicación de Roy: el día de la función siempre obtendrá el valor del mes. Use lo siguiente:

           

Gracias, este post me ayudó mucho.

Estaba transformando una fuente RSS que usa el siguiente formato de fecha: Lun, 04 Abr 2011 23:18:00 -0700 . Aquí está la plantilla con nombre que utilicé para analizarlo.