2008-09-26 7 views
2

Мне было трудно найти хорошие способы принятия формата времени и легко определить, действительно ли он действителен, а затем создает результирующий элемент, который имеет некоторое форматирование с использованием XSLT 1.0.Каков наилучший способ форматирования 24-часового времени в 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 фрагмента, который мог быть написаны для получения желаемых результатов? Надежда состояла бы в том, чтобы держать его достаточно простым и не нужно разбирать каждую часть времени (например, сопоставление образцов было бы приятным, если возможно).

+0

Не могли бы заметить, что 2400 является недопустимой датой. Полдень - 1200, а полночь - 0000. – dacracot 2008-09-26 23:40:15

ответ

5

В 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

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

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

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

1

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

1

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

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

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

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

2

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

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

XSLT двигатель Microsoft поддерживает пользовательские расширения, а также, как описано в .NET Framework Developer's Guide, Extending XSLT Style Sheets