我正在使用XSLT创建XML文件。日期时间有毫秒。我需要输出XML而不是毫秒。
格式必须为YYYY-MM-DDTHH:MM:SS
例如:
XML将日期显示为:2012-12-341T09:26:53.132-0500
但这必须是:2012-12-341T09:26:53
答案 0 :(得分:1)
如果您使用的是XSLT2,请参阅此函数:http://www.w3.org/TR/xslt20/#function-format-dateTime。这个图片字符串应该给你你想要的东西:
format-dateTime($dateTime,'[Y0001]-[M01]-[D01]T[H01]:[m01]:[s01]')
答案 1 :(得分:1)
如果所有值都是dateTime并且.
,则可以使用 substring-before()
:
substring-before('2012-12-341T09:26:53.132-0500', '.')
您可以使用 substring()
来选择前20个字符:
substring('2012-12-341T09:26:53.132-0500', 0, 21)
答案 2 :(得分:0)
此XPath表达式产生想要的结果,无论字符串是包含点还是连字符,还是包含点和连字符,或者没有,并且不依赖于用于年,月,日的数字位数< /强>:
substring-before(concat(substring-before(concat(substring-after(.,'T'),
'.'),
'.'),
'-'),
'-')
这是一个使用此XPath表达式的简单XSLT转换:
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output omit-xml-declaration="yes" indent="yes"/>
<xsl:strip-space elements="*"/>
<xsl:template match="node()|@*">
<xsl:copy>
<xsl:apply-templates select="node()|@*"/>
</xsl:copy>
</xsl:template>
<xsl:template match="dt/text()">
<xsl:value-of select="substring-before(., 'T')"/>
<xsl:text>T</xsl:text>
<xsl:value-of select=
"substring-before(concat(substring-before(concat(substring-after(.,'T'),
'.'),
'.'),
'-'),
'-')
"/>
</xsl:template>
</xsl:stylesheet>
在此测试XML文档上应用此转换时:
<t>
<dt>2012-12-341T09:26:53.132-0500</dt>
<dt>2012-12-355T09:34:56</dt>
<dt>2012-12-355T09:34:56-0500</dt>
<dt>2012-12-13T9:34:5-0500</dt>
<dt>2012-12-344T09:12:34.378-0500</dt>
</t>
产生了想要的正确结果:
<t>
<dt>2012-12-341T09:26:53</dt>
<dt>2012-12-355T09:34:56</dt>
<dt>2012-12-355T09:34:56</dt>
<dt>2012-12-13T9:34:5</dt>
<dt>2012-12-344T09:12:34</dt>
</t>
<强>解释强>:
正确应用 sentinels 。