我正在使用 XSLT 创建 XML 文件。日期时间有毫秒。我需要在没有毫秒的情况下输出 XML。
格式必须是YYYY-MM-DDTHH:MM:SS
例如:
XML 将日期显示为:2012-12-341T09:26:53.132-0500
但这需要是:2012-12-341T09:26:53
我正在使用 XSLT 创建 XML 文件。日期时间有毫秒。我需要在没有毫秒的情况下输出 XML。
格式必须是YYYY-MM-DDTHH:MM:SS
例如:
XML 将日期显示为:2012-12-341T09:26:53.132-0500
但这需要是:2012-12-341T09:26:53
如果所有值都是 dateTime 并且具有.
,则可以使用substring-before()
:
substring-before('2012-12-341T09:26:53.132-0500', '.')
您可以substring()
用来选择前 20 个字符:
substring('2012-12-341T09:26:53.132-0500', 0, 21)
如果您使用的是 XSLT2,请参阅此功能:http ://www.w3.org/TR/xslt20/#function-format-dateTime 。这个图片字符串应该给你你想要的:
format-dateTime($dateTime,'[Y0001]-[M01]-[D01]T[H01]:[m01]:[s01]')
无论字符串是否包含点或连字符或点和连字符都包含,或者没有,此 XPath 表达式都会产生所需的结果,并且不依赖于 year、month、day 使用的位数:
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>
说明:
正确应用哨兵。