源XML中的不同日期格式
问题描述:
我正在使用XSLT 2.0将日期从MM/dd/yyyy转换为yyyy-MM-dd。这似乎很简单,直到我意识到我的源码丢弃了所有前导零。所以sometimmes我输入源XML中的不同日期格式
<col11>11/14/2014</col11>
,但有时它看起来像这样
<col11>1/5/2015</col15>
所以我用这个来格式化,
<outputcolumn>
<xsl:variable name="date1" select="col11"/>
<xsl:variable name="formatted_date1" select="concat(substring($date1,7,4),'-',substring($date1,1,2),'-',substring($date1,4,2))"/>
<xsl:value-of select="$formatted_date1"/>
</outputcolumn>
,对于第一次输入的伟大工程,但不是第二个丢弃前导零的那个。
如何格式化导致不同格式的前导零被删除的日期?
答
你可以tokenize()
和format-number()
......
<xsl:template match="col11">
<xsl:variable name="tokens" select="tokenize(normalize-space(),'/')"/>
<outputcolumn>
<xsl:value-of
select="($tokens[3],
format-number(number($tokens[1]),'00'),
format-number(number($tokens[2]),'00'))"
separator="-"/>
</outputcolumn>
</xsl:template>
答
除了@Daniel海利的解决方案[学分去他]:
创建的SchemaType“XS有效日期:日期( )” [格式:YYYY-MM-DD]:
<xsl:variable name="dateparts" select="tokenize(normalize-space(),'/')"/>
<xsl:variable name="validdate" select="concat($dateparts[3], '-', format-number(number($dateparts[1]), '00'), '-', format-number(number($dateparts[2]), '00'))"/>
功能format-date
w3#function-format-date:
<xsl:value-of select="format-date(xs:date($validdate), '[Y0001]-[M01]-[D01]')"/>
提示命名空间前缀xs
必须定义为
您的日期已经在YYYY-MM-DD格式,所以格式化使用'格式的日期()'无所作为。如果是YYYY-MM-DD,则为 –
。对于其他任何可能的输出格式,这是一种可行的方法。 – uL1
对于其他任何可能的输出格式,您可以在不经过YYYY-MM-DD的情况下以合适的格式组装令牌。 –