在 XSLT 中格式化日期
Formatting a date in XSLT
使用 format-date($date, 'yyyy-MM-dd')
输出日期 dd/MM/yyyy
。
详情
我正在与使用以下日期格式的系统集成:
<SomeDateElement>
<DAY>21</DAY>
<MONTH>06</MONTH>
<YEAR>2017</YEAR>
</SomeDateElement>
为了将这些值转换为有效的 xs:date
/ xs:datetime
元素,我在我的 XSLT 中创建了以下逻辑:
模板匹配任何 "fake dates":
<xsl:template match="//*[./YEAR and ./MONTH and ./DAY]">
<xsl:call-template name="ConvertFakeDateToXmlDateTime">
<!-- <xsl:with-param name="format">yyyy-MM-DDTHH:mm:ss</xsl:with-param> -->
</xsl:call-template>
</xsl:template>
用于格式化任何 "fake date" 的模板(与上述分开,以便于我希望指定不同格式/通过其他匹配捕获的那些日期轻松重用)。
<xsl:template name="ConvertFakeDateToXmlDateTime">
<xsl:param name="format" select="yyyy-MM-dd" />
<xsl:variable name="date" select="concat(./YEAR/text(),'-',./MONTH/text(),'-',./DAY/text())" /> <!-- as="xs:datetime" -->
<!-- debugging code-->
<xsl:element name="{concat('DEBUG_',name(.))}">
<xsl:attribute name="IAmADate">
<xsl:value-of select="$date"/> <!-- show our date variable's content -->
</xsl:attribute>
<xsl:apply-templates select="@* | node()" /> <!-- show the original value -->
</xsl:element>
<!-- end debugging code -->
<xsl:element name="{name(.)}" namespace="{namespace-uri(.)}">
<xsl:value-of select="msxsl:format-date($date, $format)"/>
</xsl:element>
</xsl:template>
使用上面的代码和示例输入我得到以下输出:
<DEBUG_SomeDateElement xmlns="" IAmADate="2017-06-21">
<DAY>21</DAY>
<MONTH>06</MONTH>
<YEAR>2017</YEAR>
</DEBUG_SomeDateElement>
<SomeDateElement xmlns="">21/06/2017</SomeDateElement>
补充说明
我正在使用 Microsoft .Net 的 System.Xml.Xsl.XslCompiledTransform
.
执行转换
我的样式表包含 attribute/namespace:xmlns:msxsl="urn:schemas-microsoft-com:xslt"
,用于 format-date
函数。
简单示例
我也试图通过这样做来简化问题:
<xsl:element name="demo">
<xsl:value-of select="msxsl:format-date('2017-06-21', 'yyyy-MM-dd')"/>
</xsl:element>
和
<xsl:element name="demo">
<xsl:variable name="demoDate" select="2017-06-21" />
<xsl:value-of select="msxsl:format-date($demoDate, 'yyyy-MM-dd')"/>
</xsl:element>
- 第一个示例(日期和格式是文字)给出了
<demo>2017-06-21</demo>
。 ✔
- 第二个(日期是一个变量)给出了
<demo>1900-01-01</demo>
。 ✘
因此,我无法重现我在上面看到的确切问题;尽管我现在发现了第二个问题,这意味着我误解了有关 XSLT 变量的某些内容。
您需要在选择中引用值以使其成为字符串:
<xsl:variable name="demoDate" select="'2017-06-21'" />
和
<xsl:param name="format" select="'yyyy-MM-dd'" />
使用 format-date($date, 'yyyy-MM-dd')
输出日期 dd/MM/yyyy
。
详情
我正在与使用以下日期格式的系统集成:
<SomeDateElement>
<DAY>21</DAY>
<MONTH>06</MONTH>
<YEAR>2017</YEAR>
</SomeDateElement>
为了将这些值转换为有效的 xs:date
/ xs:datetime
元素,我在我的 XSLT 中创建了以下逻辑:
模板匹配任何 "fake dates":
<xsl:template match="//*[./YEAR and ./MONTH and ./DAY]">
<xsl:call-template name="ConvertFakeDateToXmlDateTime">
<!-- <xsl:with-param name="format">yyyy-MM-DDTHH:mm:ss</xsl:with-param> -->
</xsl:call-template>
</xsl:template>
用于格式化任何 "fake date" 的模板(与上述分开,以便于我希望指定不同格式/通过其他匹配捕获的那些日期轻松重用)。
<xsl:template name="ConvertFakeDateToXmlDateTime">
<xsl:param name="format" select="yyyy-MM-dd" />
<xsl:variable name="date" select="concat(./YEAR/text(),'-',./MONTH/text(),'-',./DAY/text())" /> <!-- as="xs:datetime" -->
<!-- debugging code-->
<xsl:element name="{concat('DEBUG_',name(.))}">
<xsl:attribute name="IAmADate">
<xsl:value-of select="$date"/> <!-- show our date variable's content -->
</xsl:attribute>
<xsl:apply-templates select="@* | node()" /> <!-- show the original value -->
</xsl:element>
<!-- end debugging code -->
<xsl:element name="{name(.)}" namespace="{namespace-uri(.)}">
<xsl:value-of select="msxsl:format-date($date, $format)"/>
</xsl:element>
</xsl:template>
使用上面的代码和示例输入我得到以下输出:
<DEBUG_SomeDateElement xmlns="" IAmADate="2017-06-21">
<DAY>21</DAY>
<MONTH>06</MONTH>
<YEAR>2017</YEAR>
</DEBUG_SomeDateElement>
<SomeDateElement xmlns="">21/06/2017</SomeDateElement>
补充说明
我正在使用 Microsoft .Net 的 System.Xml.Xsl.XslCompiledTransform
.
我的样式表包含 attribute/namespace:xmlns:msxsl="urn:schemas-microsoft-com:xslt"
,用于 format-date
函数。
简单示例
我也试图通过这样做来简化问题:
<xsl:element name="demo">
<xsl:value-of select="msxsl:format-date('2017-06-21', 'yyyy-MM-dd')"/>
</xsl:element>
和
<xsl:element name="demo">
<xsl:variable name="demoDate" select="2017-06-21" />
<xsl:value-of select="msxsl:format-date($demoDate, 'yyyy-MM-dd')"/>
</xsl:element>
- 第一个示例(日期和格式是文字)给出了
<demo>2017-06-21</demo>
。 ✔ - 第二个(日期是一个变量)给出了
<demo>1900-01-01</demo>
。 ✘
因此,我无法重现我在上面看到的确切问题;尽管我现在发现了第二个问题,这意味着我误解了有关 XSLT 变量的某些内容。
您需要在选择中引用值以使其成为字符串:
<xsl:variable name="demoDate" select="'2017-06-21'" />
和
<xsl:param name="format" select="'yyyy-MM-dd'" />