5 Stimmen

XSLT-Transformation datetime in Datumsformat

Ich versuche, eine datetime in ein Datumsformat yyyy-MM-dd umzuwandeln. Da ich das Tool xsd.exe verwende, werden die xs:date-Datentypen automatisch in einen datetime-Datentyp umgewandelt, da es im .NET Framework keinen Typ gibt, der dem Typ xs:date vollständig entspricht.

Aber ich kann es nicht zum Laufen bringen

<articles>
        <article>
          <articleid>48992</articleid>
          <deliverydateasked>2009-01-29T00:00:00+01:00</deliverydateasked>
        </article>
        <article>
          <articleid>48993</articleid>
          <deliverydateasked>2009-01-30T00:00:00+01:00</deliverydateasked>
        </article>
</articles>

Ich versuche, die xml in

<articles>
        <article>
          <articleid>48992</articleid>
          <deliverydateasked>2009-01-29</deliverydateasked>
        </article>
        <article>
          <articleid>48993</articleid>
          <deliverydateasked>2009-01-30</deliverydateasked>
        </article>
</articles>

Derzeit verwende ich dieses XSLT

<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="1.0">
<xsl:template match="/">
    <articles>
        <xsl:apply-templates select="article">
        </xsl:apply-templates>
            </articles>
</xsl:template>

<xsl:template name="FormatDate">

    <xsl:param name="DateTime" />
    <xsl:variable name="date">
        <xsl:value-of select="substring-before($DateTime,'T')" />
    </xsl:variable>

    <xsl:if test="string-length($date) != 10">
        <xsl:value-of select="$DateTime"/>
    </xsl:if>
    <xsl:if test="string-length($date) = 10">
        <xsl:value-of select="$date"/>
    </xsl:if>
</xsl:template>

<xsl:template match="article">
        <xsl:call-template name="FormatDate">
            <xsl:with-param name="DateTime" select="deliverydateasked"/>
        </xsl:call-template>    
</xsl:template>     

Kennt jemand eine gute xslt-Transformation.

Vielen Dank im Voraus

Das Ausgabeergebnis meines Codes lautet

<articles />

8voto

Scott White Punkte 600

Die Formatierung wird in XPath 2.0, das Microsoft seit 8 Jahren nicht mehr unterstützt, viel einfacher werden. Da das Formatierungsproblem wirklich nur für XSLT in .Net besteht, verwende ich gerne eine benutzerdefinierte Funktion, die sauberer und einfacher ist:

XSLT mit Formatierungsfunktion:

    xmlns="http://www.w3.org/1999/xhtml"
    xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
    xmlns:msxsl="urn:schemas-microsoft-com:xslt"
    xmlns:user="http://www.tempuri.org/User">

  <msxsl:script implements-prefix="user" language="C#">
        <![CDATA[
          public string FormatCurrency(string amount)
          {
            return decimal.Parse(amount).ToString("C0");
          }

          public string FormatDate(string dateValue)
          {
            return DateTime.Parse(dateValue).ToString("MM/dd/yyyy hh:mm");
          }
          ]]>
      </msxsl:script>

Verwendung:

<xsl:value-of select="user:FormatDate(@transactionDate)"/>
<xsl:value-of select="user:FormatCurrency(@amount)"/>

Wenn Sie Ihr XSLT in .Net ausführen, stellen Sie sicher, dass Sie ihm mitteilen, dass es vertrauenswürdig ist (damit der msxsl:script-Block ausgeführt wird).

XslCompiledTransform.Load(reader, XsltSettings.TrustedXslt, null);

7voto

annakata Punkte 72408

Ehrlich gesagt finde ich das in Ordnung - manchmal reicht eine einfache Teilzeichenkette aus.

Wenn Sie sich jedoch im .NET-Land befinden und wirklich zusätzliche Funktionen benötigen, bietet .NET XSLT-Erweiterungsobjekte


edit: oic, Sie haben ein grundlegendes konzeptionelles Problem mit apply-templates. Versuchen Sie dies (beachten Sie, dass die Kopie und die Root-Vorlage übereinstimmen):

<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="1.0">

<xsl:template match="*">
    <xsl:copy><xsl:apply-templates /></xsl:copy>
</xsl:template>

<xsl:template match="deliverydateasked">
    <xsl:copy>
        <xsl:call-template name="FormatDate">
            <xsl:with-param name="DateTime" select="."/>
        </xsl:call-template>    
    </xsl:copy>
</xsl:template>

<xsl:template name="FormatDate">

        <xsl:param name="DateTime" />
        <xsl:variable name="date">
                <xsl:value-of select="substring-before($DateTime,'T')" />
        </xsl:variable>

        <xsl:if test="string-length($date) != 10">
                <xsl:value-of select="$DateTime"/>
        </xsl:if>
        <xsl:if test="string-length($date) = 10">
                <xsl:value-of select="$date"/>
        </xsl:if>
</xsl:template>

</xsl:stylesheet>

Vorlagen ein schwer zu erlernendes Konzept ist, sollten Sie vielleicht besser mit dem einfacheren for-each und/oder es scheint, als könnten Sie einige XSLT-Tutorials/Bücher gebrauchen.

2voto

freggel Punkte 542

Dank Stesoc und annakata habe ich es herausgefunden Das ist der Code, den ich jetzt verwende, und er funktioniert perfekt

<xsl:template match="*">
    <xsl:param name="parentElm">
        <xsl:value-of select="name(..)" />
    </xsl:param>
    <xsl:choose>
        <xsl:when test="local-name() = 'deliverydateasked'">
            <xsl:element name="deliverydateasked">
                <xsl:call-template name="FormatDate">
                    <xsl:with-param name="DateTime" select="."/>
                </xsl:call-template>
            </xsl:element>
        </xsl:when>
        <xsl:otherwise>
            <xsl:element name="{local-name()}">
                <xsl:copy-of select="@*" />
                <xsl:apply-templates select="@* | node()" />
            </xsl:element>
        </xsl:otherwise>
    </xsl:choose>
</xsl:template>

<xsl:template name="FormatDate">
    <xsl:param name="DateTime" />
    <xsl:variable name="date">
        <xsl:value-of select="substring-before($DateTime,'T')" />
    </xsl:variable>

    <xsl:if test="string-length($date) != 10">
        <xsl:value-of select="$DateTime"/>
    </xsl:if>
    <xsl:if test="string-length($date) = 10">
        <xsl:value-of select="$date"/>
    </xsl:if>
</xsl:template>

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X