如何在XSLT中转换WordPress feed的pubDate日期格式?
报错原因
FORG0001报错的核心逻辑是:XSLT内置的format-date()、format-dateTime()函数仅支持传入标准xs:date/xs:dateTime类型的参数,而WordPress RSS输出的<pubDate>是RFC 822格式的普通字符串,无法被自动识别转换为标准日期类型,因此直接传值会触发类型校验失败。
这类日期格式转换完全可以通过原生XSLT实现,无需依赖外部工具,以下是两种主流环境下的实现方案:
XSLT 2.0/3.0 解决方案
XSLT 2.0及以上版本支持tokenize、index-of等字符串处理函数,可以通过月份映射快速完成转换:
<xsl:element name="field"> <xsl:attribute name="name">ds_date_created</xsl:attribute> <!-- 定义月份缩写到两位数字的映射数组 --> <xsl:variable name="month-map" select="('Jan','01','Feb','02','Mar','03','Apr','04','May','05','Jun','06','Jul','07','Aug','08','Sep','09','Oct','10','Nov','11','Dec','12')"/> <!-- 去除开头的星期前缀和多余空白字符 --> <xsl:variable name="pure-date" select="substring-after(normalize-space(pubDate), ', ')"/> <!-- 按空格拆分日期各部分 --> <xsl:variable name="date-segments" select="tokenize($pure-date, '\s+')"/> <!-- 匹配得到月份对应的数字 --> <xsl:variable name="month-num" select="$month-map[index-of($month-map, $date-segments[2]) + 1]"/> <!-- 直接拼接为目标格式 --> <xsl:value-of select="concat($date-segments[3], '-', $month-num, '-', $date-segments[1], 'T', $date-segments[4], 'z')"/> </xsl:element>
如果需要处理非UTC时区的场景,可以先把拼接后的字符串转换为标准xs:dateTime类型,再通过format-dateTime()函数做更灵活的格式输出。
XSLT 1.0 解决方案
如果运行环境仅支持XSLT 1.0,没有高阶字符串处理函数,可以使用分支判断完成月份转换:
<xsl:element name="field"> <xsl:attribute name="name">ds_date_created</xsl:attribute> <!-- 去除开头的星期前缀和多余空白字符 --> <xsl:variable name="pure-date" select="substring-after(normalize-space(pubDate), ', ')"/> <!-- 按固定位置截取各日期片段 --> <xsl:variable name="day" select="substring($pure-date, 1, 2)"/> <xsl:variable name="month-str" select="substring($pure-date, 4, 3)"/> <xsl:variable name="year" select="substring($pure-date, 8, 4)"/> <xsl:variable name="time" select="substring($pure-date, 13, 8)"/> <!-- 匹配月份对应的数字 --> <xsl:variable name="month-num"> <xsl:choose> <xsl:when test="$month-str = 'Jan'">01</xsl:when> <xsl:when test="$month-str = 'Feb'">02</xsl:when> <xsl:when test="$month-str = 'Mar'">03</xsl:when> <xsl:when test="$month-str = 'Apr'">04</xsl:when> <xsl:when test="$month-str = 'May'">05</xsl:when> <xsl:when test="$month-str = 'Jun'">06</xsl:when> <xsl:when test="$month-str = 'Jul'">07</xsl:when> <xsl:when test="$month-str = 'Aug'">08</xsl:when> <xsl:when test="$month-str = 'Sep'">09</xsl:when> <xsl:when test="$month-str = 'Oct'">10</xsl:when> <xsl:when test="$month-str = 'Nov'">11</xsl:when> <xsl:when test="$month-str = 'Dec'">12</xsl:when> </xsl:choose> </xsl:variable> <!-- 拼接为目标格式 --> <xsl:value-of select="concat($year, '-', $month-num, '-', $day, 'T', $time, 'z')"/> </xsl:element>
内容的提问来源于stack exchange,提问作者Asatur
相关产品推荐
相关产品推荐

