2017-06-21 17 views
0

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.

+1

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. –

+1

Das gleiche für '', ich glaube du willst ' '. –

+0

Ah; Das war's; Danke euch beiden! Bitte reichen Sie als Antwort ein und ich werde als akzeptiert markieren. – JohnLBevan

Antwort

0

Sie müssen die Werte in Ihrer wählt zitieren, um sie Saiten zu machen:

<xsl:variable name="demoDate" select="'2017-06-21'" /> 

und

<xsl:param name="format" select="'yyyy-MM-dd'" /> 
Verwandte Themen