Я получаю xml из другой системы с узлом CREATION_DATE.
<CREATION_DATE>20/05/2021 10:10:00 </CREATION_DATE>
Мне нужно преобразовать этот узел в миллисекунду unix, например
<CREATION_DATE>161273897651200 </CREATION_DATE>
Мой XSLT не может его преобразовать.
<xsl:if test = "/CREATION_DATE != ''" >
<creation_date>
<xsl:variable name = "dateTimeValue"/>
<xsl:value-of select = "(/CREATION_DATE,'0')[.
ne ''][1]"/>
<xsl:sequence select=
"( xs:dateTime($dateTimeValue) - xs:dateTime('1970-01-01T00:00:00') )
div
xs:dayTimeDuration('PT1S')
"/>
</creation_date>
</xsl:if>
Не уверен, что не так, помогите пожалуйста
Значение CREATION_DATE
не является допустимой строкой в формате dateTime. Поэтому вам нужно сначала создать правильно отформатированное значение даты и времени, чтобы использовать его для $dateTimeValue
из 2021-05-20T10:10:00
:
<xsl:if test = "/CREATION_DATE != ''" >
<creation_date>
<xsl:variable name = "dateTimeSeq" select = "tokenize(/CREATION_DATE, ' ')"/>
<xsl:variable name = "dateTimeValue" select = "concat(string-join(reverse(tokenize($dateTimeSeq[1], '/')), '-'), 'T', $dateTimeSeq[2])"/>
<xsl:sequence select=
"( xs:dateTime($dateTimeValue) - xs:dateTime('1970-01-01T00:00:00') )
div
xs:dayTimeDuration('PT1S')
"/>
</creation_date>
</xsl:if>
Временная метка Unix — это число секунды (не миллисекунды) с
1970-01-01T00:00:00
. Если вам действительно нужно количество миллисекунд, вы должны разделить разницу наxs:dayTimeDuration('PT0.001S')
вместоxs:dayTimeDuration('PT1S')
. Но результат, который вы показываете, все равно на 2 порядка выше этого. (И, конечно же, вы должны сначала преобразовать ввод в допустимое значение dateTime, как показано в ответе Мэдса Хансена ниже.)