关于XPath 2.0的format-date()/format-time()函数输入格式定义咨询
关于XPath 2.0中format-date()/format-time()处理多源格式日期时间的方案
首先得明确:format-date()和format-time()的作用是格式化已经是标准XML Schema日期/时间类型(xs:date/xs:time/xs:dateTime)的值,它们本身不具备解析自定义格式字符串的能力。所以要处理多种源格式的输入,核心思路是两步:
- 把不同格式的日期时间字符串解析转换为标准的
xs:date/xs:time/xs:dateTime类型 - 再用
format-date()/format-time()输出你需要的目标格式
处理符合XML Schema规范的格式
如果你的源格式是XML Schema定义的合法格式(比如yyyy-MM-dd、HH:mm:ss这类),直接用类型构造函数转换即可:
<!-- 示例:把合法的日期字符串转成xs:date,再格式化 --> <xsl:variable name="source-date" select="'2024-03-15'"/> <xsl:variable name="standard-date" select="xs:date($source-date)"/> <xsl:value-of select="format-date($standard-date, '[D01]/[M01]/[Y0001]')"/> <!-- 输出15/03/2024 -->
处理自定义/非标准格式
如果源格式是自定义的(比如dd/mm/yyyy、MM-dd-yyyy HH:mm这类),可以用XSLT 2.0的analyze-string函数来解析字符串,提取年、月、日、时、分等组件,再构造标准类型:
<!-- 示例:解析dd/mm/yyyy格式的字符串,转成标准日期后格式化 --> <xsl:variable name="custom-date" select="'15/03/2024'"/> <xsl:analyze-string select="$custom-date" regex="(\d{2})/(\d{2})/(\d{4})"> <xsl:matching-substring> <!-- 提取日、月、年,按xs:date要求的yyyy-MM-dd格式拼接 --> <xsl:variable name="standard-date" select="xs:date(concat(group(3), '-', group(2), '-', group(1)))"/> <!-- 输出目标格式,比如中文格式 --> <xsl:value-of select="format-date($standard-date, '[Y0001]年[M01]月[D01]日')"/> <!-- 输出2024年03月15日 --> </xsl:matching-substring> </xsl:analyze-string>
适配多种源格式的场景
如果需要在XSLT的不同场景处理多种源格式,可以封装一个复用的模板,通过判断字符串的格式特征(比如分隔符、长度)来选择对应的解析逻辑:
<xsl:template name="parse-and-format-date"> <xsl:param name="input-string"/> <xsl:param name="target-format"/> <!-- 处理dd/mm/yyyy格式 --> <xsl:if test="matches($input-string, '\d{2}/\d{2}/\d{4}')"> <xsl:analyze-string select="$input-string" regex="(\d{2})/(\d{2})/(\d{4})"> <xsl:matching-substring> <xsl:value-of select="format-date(xs:date(concat(group(3), '-', group(2), '-', group(1))), $target-format)"/> </xsl:matching-substring> </xsl:analyze-string> </xsl:if> <!-- 处理MM-dd-yyyy格式 --> <xsl:if test="matches($input-string, '\d{2}-\d{2}-\d{4}')"> <xsl:analyze-string select="$input-string" regex="(\d{2})-(\d{2})-(\d{4})"> <xsl:matching-substring> <xsl:value-of select="format-date(xs:date(concat(group(3), '-', group(1), '-', group(2))), $target-format)"/> </xsl:matching-substring> </xsl:analyze-string> </xsl:if> <!-- 可继续添加其他格式的处理分支 --> </xsl:template> <!-- 调用模板示例 --> <xsl:call-template name="parse-and-format-date"> <xsl:with-param name="input-string" select="'03-15-2024'"/> <xsl:with-param name="target-format" select="'[Y0001]-[M01]-[D01]'"/> </xsl:call-template> <!-- 输出2024-03-15 -->
注意:如果你的源格式非常复杂,也可以考虑使用XSLT的扩展函数,但尽量优先使用原生XSLT 2.0特性,避免依赖外部扩展。
内容的提问来源于stack exchange,提问作者feiyang
相关产品推荐
相关产品推荐

