在XSLT中格式化日期

时间:2017-06-21 17:42:30

标签: xml date datetime xslt formatdatetime

使用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中创建了以下逻辑:

匹配任何“假日期”的模板:

<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>

用于格式化任何“假日期”的模板(与上述内容分开,以便在我希望指定不同格式/通过其他匹配捕获的日期中轻松重复使用)。

<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>

使用上述代码&amp;示例输入我得到以下输出:

<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进行转换。

我的样式表包含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变量有些误解。

1 个答案:

答案 0 :(得分:0)

您需要引用选择中的值以使其成为字符串:

<xsl:variable name="demoDate" select="'2017-06-21'" />

<xsl:param name="format" select="'yyyy-MM-dd'" />