Каков наилучший способ форматирования 24-часового времени в XSLT 1.0?

StackOverflow https://stackoverflow.com/questions/142400

  •  02-07-2019
  •  | 
  •  

Вопрос

Мне было трудно найти хорошие способы использовать формат времени и легко определить, является ли он допустимым, а затем создать результирующий элемент, который имеет некоторое форматирование, используя XSLT 1.0.

Учитывая следующий xml-файл:

<root>
    <srcTime>2300</srcTime>
</root>

Было бы здорово создать результирующий xml-файл:

<root>
    <dstTime>23:00</dstTime>
</root>

Однако, если исходный xml-файл содержит недопустимый 24-часовой формат времени, результирующий Летнее время элемент должен быть пустым.

Например, когда недопустимый исходный xml имеет следующий вид:

<root>
    <srcTime>NOON</srcTime>
</root>

Результирующий XML-файл должен быть:

<root>
    <dstTime></dstTime>
</root>

Вопрос в том, что это за лучший XSLT 1.0 фрагмент, который можно было бы записать для получения желаемых результатов?Надежда состояла бы в том, чтобы сделать это довольно простым и не разбирать каждый фрагмент времени (т. е.сопоставление с образцом было бы очень кстати, если это возможно).

Это было полезно?

Решение

В XSLT 1.0 нет никаких регулярных выражений, поэтому я боюсь, что сопоставление с шаблоном будет невозможно.

Мне не совсем ясно, если <srcTime>23:00</srcTime> это должно быть законно или нет?Если это так, попробуйте:

<dstTime>
  <xsl:if test="string-length(srcTime) = 4 or
                string-length(srcTime) = 5">
    <xsl:variable name="hour" select="substring(srcTime, 1, 2)" />
    <xsl:if test="$hour >= 0 and 24 > $hour">
      <xsl:variable name="minute">
        <xsl:choose>
          <xsl:when test="string-length(srcTime) = 5 and
                          substring(srcTime, 3, 1) = ':'">
            <xsl:value-of select="substring(srcTime, 4, 2)" />
          </xsl:when>
          <xsl:when test="string-length(srcTime) = 4">
            <xsl:value-of select="substring(srcTime, 3, 2)" />
          </xsl:when>
        </xsl:choose>
      </xsl:variable>
      <xsl:if test="$minute >= 0 and 60 > $minute">
        <xsl:value-of select="concat($hour, ':', $minute)" />
      </xsl:if>
    </xsl:if>
  </xsl:if>
</dstTime>

Если это не так, и четыре цифры - это единственное, что является законным, тогда:

<dstTime>
  <xsl:if test="string-length(srcTime) = 4">
    <xsl:variable name="hour" select="substring(srcTime, 1, 2)" />
    <xsl:if test="$hour >= 0 and 24 > $hour">
      <xsl:variable name="minute" select="substring(srcTime, 3, 2)" />
      <xsl:if test="$minute >= 0 and 60 > $minute">
        <xsl:value-of select="concat($hour, ':', $minute)" />
      </xsl:if>
    </xsl:if>
  </xsl:if>
</dstTime>

Другие советы

XSLT 1.0 не имеет никакой стандартной поддержки для манипулирования датой и временем.

Вы должны написать простую функцию синтаксического анализа и форматирования.Это будет непросто, и это будет некрасиво.

XSLT действительно предназначен для преобразования дерева.Такого рода манипуляции с текстовыми узлами лучше всего выполнять вне XSLT.

В зависимости от фактически используемого процессора xslt вы могли бы выполнять нужные операции в пользовательской функции расширения (которую вам пришлось бы создать самостоятельно).

Халан имеет хорошую поддержку для функции расширения, вы можете писать их не только на Java , но и на JavaScript или других языках, поддерживаемых Apache BSF.

Движок XSLT от Microsoft также поддерживает пользовательские расширения, как описано в Руководство разработчика .NET Framework по расширению таблиц стилей XSLT

Взгляните на:http://www.exslt.org/ в частности, в разделе "даты и время".Я не углублялся в это, но, похоже, это может быть то, что вы ищете.

Даже функция exslt.org time() здесь вам не поможет, потому что она ожидает, что ее входные данные будут в правильном формате (xs: DateTime или xs: time).

Это то, что лучше всего исправить за пределами XSLT.Я говорю это как человек, который регулярно использует XSLT для выполнения вещей, для которых он на самом деле не был предназначен, и которому удается заставить все работать.Это было в самом деле не предназначен для синтаксического анализа строк.

Идеальное решение - исправить все, что создает XML-документ, так, чтобы он форматировал times, используя международный стандарт, удобно установленный именно для этой цели, используя принцип, согласно которому вы не должны сохранять или передавать ненужные данные, если можете избежать этого.

Но если это невозможно, вам следует либо исправить данные перед передачей их в XSLT, либо исправить их после генерации выходных данных преобразования.

И чтобы список был полным, есть также Модуль обработки даты/Времени часть стандартной библиотеки XSLT от Стива Болла.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top