web-dev-qa-db-fra.com

XSLT 1.0 Obtenir l'heure actuelle

J'ai un noeud dans mon fichier XML contenant les éléments suivants:

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

Je souhaite prendre cette ligne et la remplacer par la date et l'heure actuelles en utilisant le même format que celui indiqué ci-dessus.

AAAA-MM-JJTHH: MM: SSZ

Le noeud est dans un espace de noms déclaré comme 'x'

11
Mike

Jouer avec DateTime n’est pas possible avec XSLT 1.0 seul. Dans une situation similaire, j’ai pris l’aide du scripting (C #) 

Exemple de XML:

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

Échantillon XSLT:

<?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>

Résultat obtenu:

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

Le script peut résider dans un même fichier (comme dans mon exemple de code XSLT) ou si le code déclenchant XSLTransformation est C #, déplacez le même code à l'endroit de l'appelant :)

12
InfantPro'Aravind'

Il est préférable de transmettre la date/heure actuelle à partir de votre moteur XML. Déclarez <xsl:param name="current-datetime"/> dans votre xsl:stylesheet et transmettez la valeur à partir du processeur.

6
Kirill Polishchuk

Vous ferez mieux de transmettre les données actuelles en tant qu'entrée/xsl: param au modèle.

Le XSLT se veut un langage purement fonctionnel. c'est-à-dire que tous les modèles/fonctions doivent être conformes à, par exemple, la condition suivante: Si une fonction pure est appelée avec des paramètres ne causant aucun effet secondaire, le résultat est constant par rapport à cette liste de paramètres (parfois appelé transparence référentielle), c'est-à-dire si la fonction pure est à nouveau appelée avec le même paramètres, le même résultat sera renvoyé (cela peut permettre des optimisations de cache telles que la mémorisation).

Bien qu'il existe des solutions de contournement à ce problème (comme indiqué dans InfantPro 'Aravind' ), il n'est pas recommandé de faire de telles choses; en le faisant, vous ruinez l’un des avantages les plus importants de XSLT.

0
penartur