2017-04-11 4 views
0

Ich habe eine xml wie unten:Convert Datum nach ISO 8601 und Aktualisierungswert des Knotens Xslt

<?xml version="1.0" encoding="UTF-8" standalone="no"?> 
<properties> 
<entry key="date">11-15-2017 22:45:59</entry> 
</properties> 

ich das Datumsformat nach ISO 8601 ändern möchten, und den Wert des Datums-Tag xslt aktualisieren. Die Ausgabe xml sollte so sein

<?xml version="1.0" encoding="UTF-8" standalone="no"?> 
<properties> 
<entry key="date">11-15-2017T22:45:59Z</entry> 
</properties> 

ich eine Variable mit dem umgewandelten Datumswert definiert haben. Ich benutze dieses xslt, aber nicht erwünschte Ausgabe.

Könnte mir jemand bitte helfen, da ich neu bei XSLT bin.

+0

'" Eigenschaften/Eintrag [@ name = 'date']/@ Wert "' => '" Eigenschaften/Eintrag [@ Taste = 'Datum']/@ Wert "' und '' => ' ', sollte y auflösen unser Problem. – AntonH

+1

Ich sehe nicht, wie '' tut die gewünschte Konvertierung, es merlely wählt einen Eingabeattributknoten aus. Da die Schreibweise ' {$ dateparam}' nur die Variable in XSLT 'version =" 3.0 "' und 'expand-text =" yes "' mit einem XSLT 3.0-Prozessor ausgeben würde, können Sie mit einem XSLT 2.0-Prozessor 'verwenden '. –

+0

Ich benutze die Variable hier, um das Format zu konvertieren Ich bekomme den Wert von Dataparam nicht. –

Antwort

1

Um die Ausgabe erhalten Sie aufgefordert, Sie müssen nur Ihre xsl:variable ändern:

<xsl:variable name="dateparam" select="/properties/entry[@key='date']"/> 

jedoch der angeforderte Ausgang (11-15-2017T22:45:59Z) ist keine gültige Datums- und Uhrzeit.

Dies ist, was ich tun würde:

XSLT 2,0

<xsl:stylesheet version="2.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"> 
    <xsl:output indent="yes"/> 
    <xsl:strip-space elements="*"/> 

    <xsl:template match="@*|node()"> 
    <xsl:copy> 
     <xsl:apply-templates select="@*|node()"/> 
    </xsl:copy> 
    </xsl:template> 

    <xsl:variable name="dateparam" select="/properties/entry[@key='date']"/> 

    <xsl:template match="entry[@key='date']"> 
    <xsl:copy> 
     <xsl:apply-templates select="@*"/> 
     <xsl:value-of select="replace(normalize-space($dateparam), 
     '^(\d{2})-(\d{2})-(\d{4})\s+(.*)','$3-$1-$2T$4Z')"/> 
    </xsl:copy> 
    </xsl:template> 

</xsl:stylesheet> 

Ausgabe

<properties> 
    <entry key="date">2017-11-15T22:45:59Z</entry> 
</properties> 
+0

Es funktioniert großartig. Danke für die Lösung Daniel. –

0

versuchen, etwas wie folgt aus:

<?xml version="1.0" encoding="UTF-8" ?> 
<xsl:transform version="2.0" 
    xmlns:xsl="http://www.w3.org/1999/XSL/Transform" 
    xmlns:xs="http://www.w3.org/2001/XMLSchema"> 
    <xsl:output method="xml" omit-xml-declaration="yes" encoding="UTF-8" indent="yes" /> 

    <xsl:template match="entry[@key='date']"> 
    <xsl:variable name="dateparam" select="."/> 
    <xsl:variable name="dd" select="xs:date(substring-before(., ' '))"/> 
    <xsl:variable name="tt" select="xs:time(substring-after(., ' '))"/> 
    <xsl:variable name="dt" select="dateTime($dd, $tt)"/> 
    <xsl:copy> 
     <xsl:apply-templates select="@*"/> 
     <xsl:value-of select="format-dateTime($dt, 
     '[Y0001]-[M01]-[D01]T[H01]:[m01]:[s01]Z')"/> 
    </xsl:copy> 
    </xsl:template> 

    <xsl:template match="@*|node()"> 
    <xsl:copy><xsl:apply-templates select="@*|node()"/></xsl:copy> 
    </xsl:template> 
</xsl:transform> 

By the way: <xsl:text>{$dateparam}</xsl:text> wird nicht funktionieren.

Verwenden Sie stattdessen <xsl:value-of select="$dateparam"/>.

+0

Danke für die Antwort. Wenn ich das Datum 09-20-2016 20:57:27 zum ISO-Standard ändern möchte. Bitte schlagen Sie mir die Änderungen vor. –

+0

aktualisierte Frage entsprechend. hat den von Ihnen vorgeschlagenen Code für diese Anforderung geändert.