36 votes

Formater une date en XML via XSLT

Lorsque j'utilise le sérialiseur XML pour sérialiser un DateTime , il est écrit au format suivant:

 <Date>2007-11-14T12:01:00</Date>
 

Lorsque je passe ceci dans une feuille de style XSLT pour générer du HTML, comment puis-je le formater? Dans la plupart des cas, je n'ai besoin que de la date, et quand j'ai besoin de l'heure, je ne veux bien sûr pas le "T drôle".

66voto

AnthonyWJones Points 122520

Voici quelques modèles 1.0 que vous pouvez utiliser: -

 <xsl:template name="formatDate">
	<xsl:param name="dateTime" />
	<xsl:variable name="date" select="substring-before($dateTime, 'T')" />
	<xsl:variable name="year" select="substring-before($date, '-')" />
	<xsl:variable name="month" select="substring-before(substring-after($date, '-'), '-')" />
	<xsl:variable name="day" select="substring-after(substring-after($date, '-'), '-')" />
	<xsl:value-of select="concat($day, ' ', $month, ' ', $year)" />
</xsl:template>

<xsl:template name="formatTime">
	<xsl:param name="dateTime" />
	<xsl:value-of select="substring-after($dateTime, 'T')" />
</xsl:template>
 

Appelez-les avec: -

 	<xsl:call-template name="formatDate">
		<xsl:with-param name="dateTime" select="xpath" />
	</xsl:call-template>
 

et

 	<xsl:call-template name="formatTime">
		<xsl:with-param name="dateTime" select="xpath" />
	</xsl:call-template>
 

où xpath est le chemin d'accès à un élément ou à un attribut au format date / heure standard.

25voto

0xA3 Points 73439

Le formatage de la Date n'est pas facile en XSLT 1.0. Probablement la façon la plus élégante est d'écrire une courte extension XSLT fonction en C# pour le formatage de la date. Voici un exemple:

<?xml version="1.0" encoding="utf-8"?>
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="1.0"
                xmlns:msxsl="urn:schemas-microsoft-com:xslt"
                xmlns:myExtension="urn:myExtension"
                exclude-result-prefixes="msxsl myExtension">
  <xsl:output method="xml" indent="yes"/>

  <msxsl:script implements-prefix="myExtension" language="C#">
    <![CDATA[
      public string FormatDateTime(string xsdDateTime, string format)
      {
          DateTime date = DateTime.Parse(xsdDateTime);
          return date.ToString(format); 
      }

    ]]>
  </msxsl:script>

  <xsl:template match="date">
    <formattedDate>
      <xsl:value-of select="myExtension:FormatDateTime(self::node(), 'd')"/>
    </formattedDate>
  </xsl:template>
</xsl:stylesheet>

Avec ce document d'entrée

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

vous obtiendrez

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

La fonction de formatage de la date prend une valeur de date comme une chaîne de caractères et le format décrit dans DateTime.Méthode ToString. À l'aide de .NET DateTime struct vous donne l'analyse XSD arbitraire des valeurs datetime (y compris le temps de la zone de prescripteurs), les fuseaux horaires, calcul et localisée de sortie pour gratuit.

Toutefois, sachez qu'il y est une mise en garde (http://support.microsoft.com/kb/316775) avec msxml script extensions: Chaque fois que vous chargez le XSLT d'un assemblage contenant le code du script est généré de façon dynamique et chargé en mémoire. En raison de la conception de l' .NET runtime, cette assemblée ne peut pas être déchargé. C'est pourquoi vous devez vous assurer que votre XSLT n'est chargée qu'une seule fois (et puis mis en cache pour plus de ré-utilisation). Ceci est particulièrement important lors de l'exécution à l'intérieur de IIS.

9voto

Roy Points 833

John Workman traite de cette question en détail et donne plusieurs solutions dans ce débat sur son blog. Fondamentalement, l'analyse de la personne date de composants et de se recombiner dans l'ordre que vous souhaitez. Pour votre cas, un pur XSLT 1.0+ version serait:

<?xml version="1.0" encoding="utf-8"?>
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:template match="date">
<!-- converts FROM <date>2001-12-31T12:00:00</date> TO some new format (DEFINED below) -->
<xsl:template name="FormatDate">
<xsl:param name="DateTime" />

<xsl:variable name="year" select="substring($DateTime,1,4)" />
<xsl:variable name="month-temp" select="substring-after($DateTime,'-')" />
<xsl:variable name="month" select="substring-before($month-temp,'-')" />
<xsl:variable name="day-temp" select="substring-after($month-temp,'-')" />
<xsl:variable name="day" select="substring($day-temp,1,2)" />
<xsl:variable name="time" select="substring-after($DateTime,'T')" />
<xsl:variable name="hh" select="substring($time,1,2)" />
<xsl:variable name="mm" select="substring($time,4,2)" />
<xsl:variable name="ss" select="substring($time,7,2)" />

<!-- EUROPEAN FORMAT -->
<xsl:value-of select="$day"/>
<xsl:value-of select="'.'"/> <!--18.-->
<xsl:value-of select="$month"/>
<xsl:value-of select="'.'"/> <!--18.03.-->
<xsl:value-of select="$year"/>
<xsl:value-of select="' '"/> <!--18.03.1976 -->
<xsl:value-of select="$hh"/>
<xsl:value-of select="':'"/> <!--18.03.1976 13: -->
<xsl:value-of select="$mm"/>
<xsl:value-of select="':'"/> <!--18.03.1976 13:24 -->
<xsl:value-of select="$ss"/> <!--18.03.1976 13:24:55 -->
<!-- END: EUROPEAN FORMAT -->

</xsl:template>

Un autre format (Remplace le FORMAT EUROPÉEN section):

<!-- Long DATE FORMAT -->
<xsl:choose>
<xsl:when test="$month = '1' or $month= '01'">January</xsl:when>
<xsl:when test="$month = '2' or $month= '02'">February</xsl:when>
<xsl:when test="$month= '3' or $month= '03'">March</xsl:when>
<xsl:when test="$month= '4' or $month= '04'">April</xsl:when>
<xsl:when test="$month= '5' or $month= '05'">May</xsl:when>
<xsl:when test="$month= '6' or $month= '06'">June</xsl:when>
<xsl:when test="$month= '7' or $month= '07'">July</xsl:when>
<xsl:when test="$month= '8' or $month= '08'">August</xsl:when>
<xsl:when test="$month= '9' or $month= '09'">September</xsl:when>
<xsl:when test="$month= '10'">October</xsl:when>
<xsl:when test="$month= '11'">November</xsl:when>
<xsl:when test="$month= '12'">December</xsl:when>
</xsl:choose> 
<xsl:value-of select="' '"/> <!--January -->
<xsl:value-of select="$day"/> <!--January 12 -->
<xsl:value-of select="','"/> <!--January 12,-->
<xsl:value-of select="' '"/> <!--January 12, -->
<xsl:value-of select="$year"/> <!--January 12, 2001-->
<!-- END: Long DATE FORMAT -->

Vous pouvez recombiner les éléments de la manière que vous choisissez.

5voto

Phileas Fogg Points 81

Toutes mes excuses pour les commentaires sur ce vieux fil, mais pour les autres trouver comme moi, vous pourriez aussi utiliser du javascript si vous utilisez un MS transformateur:

Déclarer la "msxsl" espace de noms:

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

Déclarer un espace de noms pour votre script:

xmlns:js="urn:custom-javascript" 

(Facultatif) Omettre les préfixes de la sortie:

exclude-result-prefixes="msxsl js" 

Si vous vous retrouvez avec une feuille de style xsl déclaration comme ceci:

<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="1.0"
  xmlns:msxsl="urn:schemas-microsoft-com:xslt"
  xmlns:js="urn:custom-javascript"
  exclude-result-prefixes="msxsl js">

Écrire le code JavaScript de la msxsl:élément de script:

<msxsl:script language="JavaScript" implements-prefix="js"> 
<![CDATA[ 
function javascriptFunction(dateValue){
  var date = new Date(dateValue);
  if(!isNaN(date)) return date.toLocaleString();
  return dateValue;
}
]]>
</msxsl:script>

Appel de la fonction JavaScript (à l'aide de la syntaxe XPath '.' dénotant 'ce nœud'):

<xsl:value-of select="js:javascriptFunction(string(.))"/>

NB: Comme de l'écriture, il ne semble pas être un (xsl) de manière à inclure externe js fichiers (par exemple. bibliothèque jquery). Cela pourrait être fait par l'analyse du fichier xsl côté serveur avant la transformation et de l'ajout de la js contenu du fichier comme une chaîne de caractères dans une section CDATA. J'ai commencé à aller dans cette voie moi-même, mais a conclu que, si vous avez besoin de ce niveau de fonctionnalité, il serait mieux placé dans une autre partie de la canalisation.

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

3voto

Andy Points 41

correction au post de roy: le jour de la fonction aura toujours la valeur du mois. Utilisez le suivant:

 <xsl:variable name="year" select="substring($dateTime,1,4)" />
<xsl:variable name="month-temp" select="substring-after($dateTime,'-')" />
<xsl:variable name="month" select="substring-before($month-temp,'-')" />
<xsl:variable name="day-temp" select="substring-after($month-temp,'-')" />
<xsl:variable name="day" select="substring($day-temp,1,2)" />
<xsl:variable name="time" select="substring-after($dateTime,'T')" />
<xsl:variable name="hh" select="substring($time,1,2)" />
<xsl:variable name="mm" select="substring($time,4,2)" />
<xsl:variable name="ss" select="substring($time,7,2)" />

<xsl:value-of select="concat($month,'/',$day,'/',$year,' ',$hh,':',$mm,':',$ss)" />
 

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X