Xslt 序号日期转换为MM/dd/yyyy格式

Xslt 序号日期转换为MM/dd/yyyy格式,xslt,xslt-2.0,Xslt,Xslt 2.0,我需要将序号日期如2011001(2011年1月1日)转换为MM/dd/yyyy格式(2011年1月1日)。XSLT2.0还可以 我可能问得不对;我不确定需要什么额外的信息来帮助解决这个问题。让我知道,我会提供任何需要的信息。欢迎使用任何解决方案或指针。这将在XSLT 2.0中起作用: <xsl:template match="date"> <xsl:copy> <xsl:analyze-string select="." regex="([0-9]{

我需要将序号日期如2011001(2011年1月1日)转换为MM/dd/yyyy格式(2011年1月1日)。XSLT2.0还可以


我可能问得不对;我不确定需要什么额外的信息来帮助解决这个问题。让我知道,我会提供任何需要的信息。欢迎使用任何解决方案或指针。

这将在XSLT 2.0中起作用:

<xsl:template match="date">
  <xsl:copy>
     <xsl:analyze-string select="." regex="([0-9]{{4}})([0-9]{{3}})">
       <xsl:matching-substring>
         <xsl:variable name="jan1" as="xs:date" select="xs:date(fn:concat(fn:regex-group(1),'-01-01'))"/>
         <xsl:variable name="offset" as="xs:dayTimeDuration" select="xs:dayTimeDuration(fn:concat('P',number(fn:regex-group(2))-1,'D'))"/>
         <xsl:value-of select="format-date($jan1+$offset, '[M,2]/[D,2]/[Y]')"/>
       </xsl:matching-substring>
       <xsl:non-matching-substring>
         <xsl:value-of select="."/>
       </xsl:non-matching-substring>
     </xsl:analyze-string>
   </xsl:copy>
</xsl:template>

秘诀是使用序数作为所提供年份1月1日的偏移量。然后,“格式化日期”可以以您想要的任何格式输出日期


您可以使用substring()而不是xsl:analyze string进行转换,但这样可以确保您只尝试以正确的格式转换日期。

@DevNull-不,实际上,年后的最后三位数字表示一年中的天数……1-365。XSLT确实不是最好的工具。如果必须的话,创建一个外部函数来使用可能是值得的。不过,它是可以做到的,但是如果您需要用纯XSLT来完成它,它将非常难看。@flyn1179-感谢您的关注;我有点想起来了。