Пользовательское форматирование даты XSLT - GSA


Я пытаюсь отформатировать XSLT в динамической навигации, чтобы отобразить даты в определенном формате. Мой код выдает следующую ошибку:

 "An unknown error occurred."

Код XSLT:

<xsl:template name="CustomDate-DN">
    <xsl:param name="d"/>
    <xsl:value-of select="format-date($d, '[D01] [MN,*-3] [Y0001]', 'en', (), ())"/>
</xsl:template>

<xsl:template match="PV" mode="display_value">
    <xsl:param name="js_escape"/>
    <xsl:choose>
        <!-- Customizations - Fancy Date -->
        <xsl:when test="../@T = 4">
            <xsl:call-template name="CustomDate-DN">
                <xsl:with-param name="d" select="@V"/>
            </xsl:call-template>
        </xsl:when>
        <!-- End of Customization -->
    ...

Если я заменю

 <xsl:value-of select="format-date($d, '[D01] [MN,*-3] [Y0001]', 'en', (), ())"/>

С

<xsl:value-of select="$d"></xsl:value-of>

Кажется, что это работает, но дата находится в неправильном формате.

Я был бы признателен за некоторую помощь. Спасибо.

UPDATE : моя дата в настоящее время выглядит как dd/mm/yyyy. Я использую xslt 2.0. Я думаю, что проблема в том, что я передаю строку в формат-функция даты. Для этой функции требуется дата. Я не знаю, как преобразовать строку dd/mm/yyyy в дату.

1 2

1 ответ:

Строка, представляющая дату в формате dd/mm/yyyy, не являетсядопустимой xs:date и не может быть использована в format-date().

Но вы можете разобрать строку и преобразовать ее в ISO 8601 дату, которая является допустимым типом xs:date. Один из способов добиться этого в XSLT 2.0 - использовать <xsl:analyze-string> для извлечения частей года, месяца и дня с регулярным выражением. Затем вы можете перестроить дату в формате ISO 8601 и сохранить результат в новой переменной, которую вы можете переход к format-date():

<xsl:template name="CustomDate-DN">
    <xsl:param name="d"/>

    <xsl:variable name="iso-date">
        <xsl:analyze-string select="$d" regex="(\d{{1,2}})/(\d{{1,2}})/(\d{{4}})">
            <xsl:matching-substring>
                <xsl:value-of select="regex-group(3)"/>
                <xsl:text>-</xsl:text>
                <xsl:value-of select="regex-group(2)"/>
                <xsl:text>-</xsl:text>
                <xsl:value-of select="regex-group(1)"/>
            </xsl:matching-substring>
        </xsl:analyze-string>
    </xsl:variable>

    <xsl:value-of select="format-date($iso-date, '[D01] [MN,*-3] [Y0001]', 'en', (), ())"/>
</xsl:template>