it-swarm.com.de

XSLT 1.0 Aktuelle Uhrzeit abrufen

Ich habe einen Knoten in meiner XML-Datei, der Folgendes enthält:

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

Ich möchte diese Zeile mit dem aktuellen Datum und der aktuellen Uhrzeit ersetzen und dasselbe Format wie oben verwenden.

JJJJ-MM-TTTHH: MM: SSZ

Der Knoten befindet sich in einem als 'x' deklarierten Namespace.

11
Mike

Das Spielen mit DateTime ist mit XSLT 1.0 alleine nicht möglich. In ähnlichen Situationen half ich beim Scripting .. (C #) 

Beispiel-XML:

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

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

Resultierende Ausgabe:

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

Das Skript kann sich in derselben Datei befinden (wie ich es in meinem Beispiel-XSLT-Code habe) oder wenn der Code, der XSLTransformation auslöst, C # ist, dann den gleichen Code an die aufrufende Stelle verschieben :)

12

Es ist besser, die aktuelle Zeit von Ihrer XML-Engine zu übergeben. Deklarieren Sie <xsl:param name="current-datetime"/> in Ihrem xsl:stylesheet und übergeben Sie den Wert vom Prozessor.

6

Sie übergeben die aktuellen Daten besser als Eingabe/xsl: param an die Vorlage.

Das XSLT zielt darauf ab, eine rein funktionale Sprache zu sein. das heißt, alle Vorlagen/Funktionen sollten z. folgende Bedingung: Wenn eine reine Funktion mit Parametern aufgerufen wird, die keine Nebenwirkungen verursachen, ist das Ergebnis in Bezug auf diese Parameterliste konstant (manchmal referenzielle Transparenz genannt), dh wenn die reine Funktion erneut mit derselben aufgerufen wird Über diese Parameter wird dasselbe Ergebnis zurückgegeben (dies kann Caching-Optimierungen wie z. B. Memoisierung ermöglichen).

Es gibt zwar Problemumgehungen (wie InfantPro'Aravind 'aufgezeigt), es wird jedoch nicht empfohlen, solche Aktionen auszuführen. Dadurch ruinieren Sie einen der wichtigsten XSLT-Vorteile.

0
penartur