Mit format-date($date, 'yyyy-MM-dd')
wird ein Datum wie dd/MM/yyyy
ausgegeben.Formatieren eines Datums in XSLT
Details
ich mit einem System bin zu integrieren, die das unter Format für Datumsangaben verwendet:
<SomeDateElement>
<DAY>21</DAY>
<MONTH>06</MONTH>
<YEAR>2017</YEAR>
</SomeDateElement>
Um diese Werte zu gültigen xs:date
/xs:datetime
Elemente zu umwandeln, ich habe die unten erstellt Logik in meinem XSLT:
Vorlage alle "fake Daten" gefunden:
<xsl:template match="//*[./YEAR and ./MONTH and ./DAY]">
<xsl:call-template name="ConvertFakeDateToXmlDateTime">
<!-- <xsl:with-param name="format">yyyy-MM-DDTHH:mm:ss</xsl:with-param> -->
</xsl:call-template>
</xsl:template>
Vorlage zum Formatieren eines "falschen Datums" (separat zu den oben genannten, um eine einfache Wiederverwendung für die Daten zu ermöglichen, für die ich ein anderes Format angeben/über andere Treffer abgefangen) möchte.
<xsl:template name="ConvertFakeDateToXmlDateTime">
<xsl:param name="format" select="yyyy-MM-dd" />
<xsl:variable name="date" select="concat(./YEAR/text(),'-',./MONTH/text(),'-',./DAY/text())" /> <!-- as="xs:datetime" -->
<!-- debugging code-->
<xsl:element name="{concat('DEBUG_',name(.))}">
<xsl:attribute name="IAmADate">
<xsl:value-of select="$date"/> <!-- show our date variable's content -->
</xsl:attribute>
<xsl:apply-templates select="@* | node()" /> <!-- show the original value -->
</xsl:element>
<!-- end debugging code -->
<xsl:element name="{name(.)}" namespace="{namespace-uri(.)}">
<xsl:value-of select="msxsl:format-date($date, $format)"/>
</xsl:element>
</xsl:template>
Unter Verwendung des obigen Code & Abtastwerteingang ich folgende Ausgabe:
<DEBUG_SomeDateElement xmlns="" IAmADate="2017-06-21">
<DAY>21</DAY>
<MONTH>06</MONTH>
<YEAR>2017</YEAR>
</DEBUG_SomeDateElement>
<SomeDateElement xmlns="">21/06/2017</SomeDateElement>
Zusätzliche Hinweise
Ich führe die System.Xml.Xsl.XslCompiledTransform
mit Microsoft .Net verwandeln.
Mein Stylesheet enthält das Attribut/namespace: xmlns:msxsl="urn:schemas-microsoft-com:xslt"
für die format-date
-Funktion.
Einfaches Beispiel
Ich habe auch versucht, das Problem dadurch zu vereinfachen, indem Sie:
<xsl:element name="demo">
<xsl:value-of select="msxsl:format-date('2017-06-21', 'yyyy-MM-dd')"/>
</xsl:element>
und
<xsl:element name="demo">
<xsl:variable name="demoDate" select="2017-06-21" />
<xsl:value-of select="msxsl:format-date($demoDate, 'yyyy-MM-dd')"/>
</xsl:element>
- Das erste Beispiel (wo Datum & Format sind Literale) gab
<demo>2017-06-21</demo>
. ✔ - Die zweite (wo Datum ist eine Variable) gab
<demo>1900-01-01</demo>
. As
Als solche konnte ich das genaue Problem nicht reproduzieren, das ich oben sehe; obwohl ich jetzt ein zweites Problem entdeckt habe, was bedeutet, dass ich etwas über XSLT-Variablen falsch verstanden habe.
Sie müssen den Wert in der Auswahl zitieren, um es einen String zu machen: ' '. Ansonsten liest der Prozessor das als 2017 minus 6 minus 21. Abgesehen von Ihrem variablen Problem bin ich mir nicht sicher, was Ihre Frage ist. –
Das gleiche für ' ', ich glaube du willst ' '. –
Ah; Das war's; Danke euch beiden! Bitte reichen Sie als Antwort ein und ich werde als akzeptiert markieren. – JohnLBevan