XSLT 2.0重新格式化日期

时间:2018-07-30 16:32:54

标签: xslt xslt-2.0

说我有一个以“ 2018-03-00”形式填写的日期。我希望它是“ 00-MAR-18”。在XSLT 2.0中,有什么功能可用于此功能。

我正在寻找month(3)= MAR。我将自己撰写其他字段。

1 个答案:

答案 0 :(得分:0)

看看format-date()

当日期为“ 00”时,您的日期不能作为xs:date强制转换。如果您确实有“ 00”,则将无法使用format-date()

如果您的日期可以转换为xs:date的日期,那么下面是一个示例...

XML输入

<test>2018-03-01</test>

XSLT 2.0

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

  <xsl:template match="/*">
    <xsl:copy>
      <xsl:value-of select="format-date(., '[D01]-[MN,*-3]-[Y01]')"/>
    </xsl:copy>
  </xsl:template>

</xsl:stylesheet>

输出

<test>01-MAR-18</test>

提琴:http://xsltfiddle.liberty-development.net/3NzcBtj

编辑

由于您的日期不是真正的日期,因此您可以创建自己的函数...

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

  <xsl:function name="so:format_month">
    <xsl:param name="date_string"/>
    <xsl:variable name="months" select="(
      'JAN','FEB','MAR',
      'APR','MAY','JUN',
      'JUL','AUG','SEP',
      'OCT','NOV','DEC')"/>
    <xsl:variable name="date_tokens" select="tokenize($date_string,'-')"/>
    <xsl:value-of select="($date_tokens[3],
      $months[number($date_tokens[2])],
      substring($date_tokens[1],3,2))" separator="-"/>
  </xsl:function>

  <xsl:template match="/*">
    <xsl:copy>
      <xsl:value-of select="so:format_month(.)"/>
    </xsl:copy>
  </xsl:template>

</xsl:stylesheet>

提琴:http://xsltfiddle.liberty-development.net/3NzcBtj/2