Необходимо отформатировать дату в соответствии с входным XML-файлом

#xslt #xslt-2.0

#xslt #xslt-2.0

Вопрос:

Необходимо изменить формат даты с 123121 (mmddyy) на 12/31/2021 (мм / дд / гггг)

Входной XML, который у меня:

 <section>
<Plans>
<Date>123121</Date>
</Plans>
</section>

<p>date: <keyword keyref="Cost:Date:date4"/></p>
 

XSL я пробовал:

 <xsl:template match="keyword[contains(@keyref, 'Cost:Date:date4')]">
        <xsl:param name="section" as="element()" tunnel="yes">
            <empty/>
        </xsl:param>
        <keyword keyref="Cost:Date:date4">
            <xsl:call-template name="format_variable">
                <xsl:with-param name="cur_keyref" select="@keyref"/>
                <xsl:with-param name="cur_value"
                    select="$section//Plans/Date"/>
                <xsl:with-param name="cur_format" select="'date4'"/>
            </xsl:call-template>
        </keyword>
    </xsl:template>
    
          <xsl:template name="format_variable">
        <xsl:param name="cur_keyref" as="xs:string">MISSING</xsl:param>
        <xsl:param name="cur_value" as="xs:string">MISSING</xsl:param>
        <xsl:param name="cur_format" as="xs:string">MISSING</xsl:param>
        <xsl:choose>
        <xsl:when test="$cur_format = 'date4'">
                <xsl:value-of select="format-dateTime($cur_value, '[M01]/[D01]/[Y0001]')"/>
            </xsl:when>
            <xsl:otherwise>
                <xsl:value-of
                    select="concat('MISSING_FORMAT_', $cur_keyref, '_', $cur_value, '_[', $cur_format, ']')"
                />
            </xsl:otherwise>
            </xsl:choose>
            </xsl:template>
 

Когда я пытаюсь использовать приведенный выше код, он показывает ошибку ниже:

 Invalid dateTime value "123121" (Too short)
 

Пожалуйста, кто-нибудь, помогите мне получить 12/31/2021(mm/dd/yyyy) значение на выходе.

Ответ №1:

Вы пытаетесь использовать format-dateTime() функцию для чего-то, что не является допустимым DateTime.

Что вы не можете сделать просто:

 <xsl:value-of select="replace(Date, '(.{2})(.{2})(.{2})', '$1/$2/20$3')"/>
 

Обратите внимание, что это предполагает, что все ваши даты будут в 21 веке. В противном случае вам потребуется дополнительная логика для определения века.