XSLT - конвертировать дату из любого формата в определенный формат - PullRequest
0 голосов
/ 24 января 2019

У меня есть значение даты в поле в XML-файле:

<xsl:value-of select="nightlyRate/@date" />

Я хочу преобразовать его в заданный формат:

<xsl:param name="dateformat" select="yyyy/mm/dd">

Как я могу это сделатьв моем XSL-преобразовании?

Ответы [ 2 ]

0 голосов
/ 24 января 2019

В XSLT 1.0 нет функции (как сказал @michael.hor257k), которая преобразует дату в определенный формат.

Вы можете добиться этого, в частности, двумя способами в зависимости от среды:

1. Если вы используете Java, вы можете писать классы Util, используя java.util.TimeZone & java.util.Calendar API.

Определите конечные статические константы в классе util и проанализируйте значение в требуемом формате даты с помощью этих API.

2. При условии, что у вас есть источник входного сигнала, как показано ниже:

<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<Root>
    <nightlyRate date="20180312" />
</Root>

Тогда xslt для преобразования будет использовать простую substring() функцию:

<?xml version="1.0" encoding="UTF-8" ?>
<xsl:transform xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
version="1.0" xmlns:xs="http://www.w3.org/2001/XMLSchema"
exclude-result-prefixes="xs">

<xsl:output indent="yes" />
<xsl:template match="node()|@*">
    <xsl:copy>
        <xsl:apply-templates select="node()|@*" />
    </xsl:copy>
</xsl:template>

<xsl:template match="/">
    <date>
        <xsl:call-template name="getFormattedDate">
            <xsl:with-param name="date" select="Root/nightlyRate/@date" />
        </xsl:call-template>
    </date>
</xsl:template>

<xsl:template name="getFormattedDate">
    <xsl:param name="date" />
    <xsl:value-of select="concat(substring($date,1,4),'/',substring($date,5,2),'/',substring($date,7,2))" />
</xsl:template>

In XSLT 2.0 ,

Используя тот же источник ввода, его можно записать следующим образом:

<?xml version="1.0" encoding="UTF-8" ?>
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
xmlns:xs="http://www.w3.org/2001/XMLSchema" exclude-result-prefixes="xs"
version="2.0">

<xsl:output omit-xml-declaration="yes" />

<xsl:template match="/">
    <xsl:variable name="dateString">
        <xsl:value-of select="substring(Root/nightlyRate/@date,1,4)" />
        <xsl:text>-</xsl:text>
        <xsl:value-of select="substring(Root/nightlyRate/@date,5,2)" />
        <xsl:text>-</xsl:text>
        <xsl:value-of select="substring(Root/nightlyRate/@date,7,2)" />
    </xsl:variable>
    <RequiredFormat>
        <xsl:value-of select="format-date(xs:date($dateString), '[Y]/[M]/[D]')" />
    </RequiredFormat>
    <OtherFormat>
        <xsl:value-of select="format-date(xs:date($dateString), '[MNn] [D], [Y]')" />
    </OtherFormat>
</xsl:template>

И вывод будет:

<RequiredFormat>2018/3/12</RequiredFormat>
<OtherFormat>March 12, 2018</OtherFormat>
0 голосов
/ 24 января 2019

Если у вас нет какого-либо умного способа узнать, представляет ли 03/04/1920 4 марта или 3 апреля, проблема невозможна.

Прежде чем вы начнете писать код на XSLT или любом другом языке, вам нужночеткое указание того, что должен делать код.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...