我正在尝试在动态导航中格式化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>
它似乎有效,但日期格式错误。
我很感激一些帮助。谢谢。
更新:我的日期目前看起来像dd/mm/yyyy
。我正在使用xslt 2.0。我认为问题是我将字符串传递给format-date函数。该功能需要一个日期。我不确定如何将dd/mm/yyyy
字符串转换为日期。
答案 0 :(得分: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>