XSLT 2.0:将简单日期转换为反转日期格式

时间:2017-08-02 07:49:30

标签: xml xslt xslt-2.0

我似乎找不到与我的XSLT 2.0转换相关的问题的解决方案。 这是源XML:

<reportInterval>
    <startDate>01.07.2016</startDate>
</reportInterval>

这是XSLT转换表的一部分:

<xsl:attribute name="per_start">
     <xsl:value-of select="format-date(reportInterval/startDate, '[Y0001]-[M01]-[D01]')"/>
</xsl:attribute>

错误如下:

Error at char 25 in xsl:value-of/@select on line 17 column 116 of Transactions.xsl:
  FORG0001: Invalid date "01.07.2016" (When year exceeds 4 digits, leading zeroes are not allowed)
  in built-in template rule

我认为这与XSL无法理解提供的日期String这一事实有关。有没有其他方法可以进行所需的转换?

提前致谢!

1 个答案:

答案 0 :(得分:2)

如果你认为这是纯粹的字符串操作,你可以做这样的事情......

 <xsl:value-of select="replace(reportInterval/startDate, '(\d{2})\.(\d{2})\.(\d{4})', '$3-$2-$1')"/>

这将返回&#34; 2017-07-01&#34;。

如果你想把它作为日期转换,并输出其他格式,那么请考虑这个XSLT ......

<xsl:transform xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="2.0" xmlns:xs="http://www.w3.org/2001/XMLSchema">
    <xsl:output method="xml" indent="yes" />

    <xsl:template match="/">
      <date>
        <xsl:variable name="date" select="replace(reportInterval/startDate, '(\d{2})\.(\d{2})\.(\d{4})', '$3-$2-$1')"/> 
        <xsl:attribute name="per_start">
             <xsl:value-of select="format-date(xs:date($date), '[MN] [D01], [Y0001]')"/>
        </xsl:attribute>
      </date>
    </xsl:template>
</xsl:transform>