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

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

С учетом следующего xml:

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

Было бы здорово создать получившийся xml:

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

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

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

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

Полученный xml должен быть:

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

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

Ответы [ 6 ]

5 голосов
/ 28 сентября 2008

В 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>
3 голосов
/ 27 сентября 2008

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

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

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

2 голосов
/ 01 октября 2008

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

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

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

1 голос
/ 01 октября 2008

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

1 голос
/ 27 сентября 2008

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

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

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

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

1 голос
/ 27 сентября 2008

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

...