3

xslt で特定の日付形式をフォーマットしようとしています。形式は次のとおりです。

2012-7-19

上記が次のようになるように、これを xslt の数値に変換して並べ替えたいと思います。

20120719

問題は、単一の月/日の前に 0 がないことです。したがって、1 桁の月/日の前に追加する必要がありますが、2 桁の月/日の前には追加しません。誰も私がこれを行う方法を知っていますか?

私はこれまでのところこれを持っています:

<xsl:value-of select="concat(
    substring(substring-after(substring-after(./AirDate, '/'),'/'),0,5),
    substring(substring-after(./AirDate, '/'), 0, 3),
    substring-before(./AirDate, '/'))"/>

しかし、それは時々1桁の日にスローされ、/1桁の月/日の前に0を入れません

データ ソースを xslt に渡す前に変更する機能がなく、xslt バージョン 1.0 を使用する必要があります。

4

4 に答える 4

7

format-number でうまくいくと思います。

<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
    <xsl:output method="xml" indent="yes" />

    <xsl:variable name="date" select="'2007-3-19'" />
    <xsl:template name="format_date" >
        <xsl:param name ="date" />
        <xsl:variable name ="year" select="substring-before($date, '-')" />
        <xsl:variable name ="month_and_day" select="substring-after($date, '-')" />
        <xsl:variable name ="day" select="substring-after($month_and_day, '-')" />
        <xsl:variable name ="month" select="substring-before($month_and_day, '-')" />
        <xsl:value-of select="$year"/>
        <xsl:value-of select="format-number($month, '00')"/>
        <xsl:value-of select="format-number($day, '00')"/>
    </xsl:template>

    <xsl:template match="/" >
        <xsl:call-template name="format_date" >
            <xsl:with-param name ="date" select="$date"/>
        </xsl:call-template>
    </xsl:template>
</xsl:stylesheet>
于 2013-04-19T20:32:28.790 に答える
1

XSLT 1.0 を使用した場合でも、これを行うためのよりエレガントな方法があると確信していますが、このかなり野蛮な解決策は 1 つのオプションです。

スタイルシート

<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
  <xsl:output method="text" version="1.0" encoding="utf-8"/>

  <xsl:variable name="HYPHEN" select="'-'"/>

  <xsl:template name="zero-pad">
    <xsl:param name="number"/>

    <xsl:choose>
      <xsl:when test="string-length($number) = 1">
        <xsl:value-of select="concat('0', $number)"/>
      </xsl:when>
      <xsl:otherwise>
        <xsl:value-of select="$number"/>
      </xsl:otherwise>
    </xsl:choose>
  </xsl:template>

  <xsl:template name="format-date">
    <xsl:param name="date"/>

    <xsl:variable name="year" select="substring-before($date, $HYPHEN)"/>
    <xsl:variable name="month-and-day"
      select="substring-after($date, concat($year, $HYPHEN))"/>

    <xsl:variable name="month">
      <xsl:call-template name="zero-pad">
        <xsl:with-param name="number"
          select="substring-before($month-and-day, $HYPHEN)"/>
      </xsl:call-template>
    </xsl:variable>

    <xsl:variable name="day">
      <xsl:call-template name="zero-pad">
        <xsl:with-param name="number"
          select="substring-after($month-and-day, $HYPHEN)"/>
      </xsl:call-template>
    </xsl:variable>

    <xsl:value-of select="number(concat($year, $month, $day))"/>
  </xsl:template>

  <xsl:template match="/">
    <xsl:call-template name="format-date">
      <xsl:with-param name="date" select="'2012-7-19'"/>
    </xsl:call-template>
  </xsl:template>
</xsl:stylesheet>

出力

20120719
于 2013-04-19T18:44:30.977 に答える
0

substring-afterとの組み合わせを使用しsubstring-beforeて断片を抽出し、それらを文字列ではなく数値として処理できます。つまり、乗算と加算を使用して最終値を生成します。

このようなもの:

<xsl:variable name="sep" select="'-'"/>
<xsl:variable name="date" select="."/>
<xsl:value-of select="substring-after(substring-after($date, $sep),$sep) + substring-before(substring-after($date, $sep),$sep)*100 + substring-before($date, $sep)*10000"/>

sepおよびdate変数をそれぞれ使用する区切り記号と元の日付文字列に設定します (質問では、サンプルは-区切り記号として使用しますが、XSLT は を使用します/)

于 2013-04-19T20:00:02.100 に答える
-1

これを試して:

<xsl:value-of select="concat(substring(date, 7, 4), '-', substring(date, 4, 2), '-', substring(date, 1, 2))"/>
于 2013-04-19T18:09:58.327 に答える