You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

关于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)的值,它们本身不具备解析自定义格式字符串的能力。所以要处理多种源格式的输入,核心思路是两步:

  1. 把不同格式的日期时间字符串解析转换为标准的xs:date/xs:time/xs:dateTime类型
  2. 再用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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.21 18:53:08