XPath 3.1 в XSL-T 3.0 Как разобрать свободный формат строки в DateTime, как в java.text.SimpleDateFormat?

Я хотел бы проанализировать почти бесплатный формат String в DateTime в XSL-T 3.0, поскольку это можно сделать в Java с помощью java.text.SimpleDateFormat. Является ли это возможным?

Я использую последнюю версию Saxon HE 9.7.0.1 для Java и консультируюсь с W3C CR 3.1 "Функции и операторы XPath и XQuery 3.1". В W3C CR 3.1 есть функция "fn:parse-ietf-date", но она не выглядит так, как будто она может анализировать строку как "6.1.94 7:29" - исключение:

Ошибка с символом 17 в xsl:value-of/@ выберите в строке 20 столбец 47 из tr.xsl: FORG0010: недопустимое значение даты IETF 6.1.94 7:29 (отсутствует разделитель даты) во встроенном шаблонном правиле Неверное значение даты IETF 6.1.94 7:29 (разделитель даты отсутствует)

Я делаю какие-либо ошибки в моем XSL-T или "fn:parse-ietf-date" не поддерживает больше форматов String для анализа в DateTime?

Если проблема не на моей стороне, возможно ли добавить функцию типа fn:parseTime в W3C CR 3.1 в качестве "копии" класса Java 8 java.text.SimpleDateFormat с поддержкой всех его шаблонов даты и времени? Это может решить разбор строки в DateTime (надеюсь, навсегда). Также это уже изобретено в Java и широко используется. Реализация этого в Saxon-HE была бы очень полезна для меня, хотя я знаю, что довольно просто вызвать java.text.SimpleDateFormat в Saxon-PE или Saxon-EE в моем сценарии XSL-T.

С уважением, Степан

Мой вариант использования:

ракушка:

java -jar .\saxon9he.jar -t -s:.\in.xml -xsl:.\tr.xsl -o:.\out.xml

in.xml:

<?xml version="1.0" encoding="UTF-8"?>
<root>6.1.94 7:29</root>

tr.xsl:

<?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"
  xmlns:math="http://www.w3.org/2005/xpath-functions/math"
  exclude-result-prefixes="xs math"
  version="3.0">
  <xsl:template
    match="/root">
    <xsl:element
      name="root">
      <xsl:element
        name="originalValue">
        <xsl:value-of
          select="./text()"/>
      </xsl:element>
      <xsl:element
        name="newValue">
        <xsl:value-of
          select="parse-ietf-date(./text())"/>
      </xsl:element>
    </xsl:element>
  </xsl:template>
</xsl:stylesheet>

1 ответ

Функция parse-ietf-date специально предназначена для разбора дат, используемых в различных стандартах IETF, которые скорее ориентированы на США (например, они всегда выражают месяц как английское название месяца и используют порядок (месяц, день, год). Он не был разработан как универсальное решение для дат в произвольных форматах.

По сути, вы выбираете либо: (а) вызвать универсальный анализатор даты в Java с помощью функций расширения, либо (б) написать XSLT-код для анализа конкретных форматов даты, которые вы хотите обработать.

Функция parse-date() была определена в библиотеке обработки дат EXSLT в течение многих лет: см. http://exslt.org/date/functions/parse-date/index.html - но она не была широко реализована и является не реализован в саксонской.

Другие вопросы по тегам