Это будет работать в 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 января поставляемого года. Затем формат-дата может выводить дату в любом формате, который вы хотите.
Вы можете использовать substring () вместо xsl: analysis-string, но этот способ позволяет вам убедиться, что вы пытаетесь конвертировать даты только в правильном формате.