2013-03-12 3 views
2

На самом деле я не задаю вопрос. Я подписал stackoverflow, чтобы вернуть что-то в сообщество, которое помогло мне так много раз.Секунды времени в XSLT

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

<xsl:template name="format-duration"> 
    <xsl:param name="value" /> 

    <xsl:variable name="minutes" select="floor($value div 60) mod 60" /> 
    <xsl:variable name="seconds" select="$value mod 60" /> 
    <xsl:variable name="hours" select="floor($value div 3600)" /> 


    <xsl:if test="$hours"> 
    <xsl:if test="$hours &lt; 10"> 
     <xsl:text>0</xsl:text> 
    </xsl:if> 
    <xsl:value-of select="$hours" /> 

    <xsl:text>:</xsl:text> 
    </xsl:if> 


    <xsl:if test="$minutes"> 
    <xsl:if test="$minutes &lt; 10"> 
     <xsl:text>0</xsl:text> 
    </xsl:if> 
    <xsl:value-of select="$minutes" /> 
    <xsl:text></xsl:text> 
    </xsl:if> 

    <xsl:if test="$minutes and $seconds"> 
    <xsl:text>:</xsl:text> 
    </xsl:if> 

    <xsl:if test="$seconds"> 
    <xsl:value-of select="$seconds" /> 
    <xsl:text></xsl:text> 
    </xsl:if> 
</xsl:template> 

EDIT: У вас есть какие-либо другие методы для достижения той же?

+1

Пожалуйста, задать вопрос и ответить на него самостоятельно. Все в порядке, чтобы принять ваши собственные ответы :) – wst

+1

На самом деле вы подразумеваете «секунды до продолжительности». И зачем останавливаться на часах? Как насчет дней и недель? Я знаю, что месяцы и годы намного сложнее, но почему бы не попробовать их тоже? Наконец, это кажется ненужным вложением усилий - гораздо лучше использовать арифметику времени ввода, доступную в XPath 2.0 (и XSLT 2.0). –

+1

Вместо того, чтобы размещать решение в вопросе, создайте вопрос и опубликуйте решение в качестве ответа. Автоответчик разрешен (даже рекомендуется). – ChrisF

ответ

5

Firt of all, благодарю вас за ваш вклад. Тем не менее, есть несколько проблем с этой реализацией. Вывод секунд не учитывает ведущий 0, но даже если это исправлено, выход может быть неоднозначным, если какая-либо из цифр будет равна 0. Например, входы 36005, 605 и 36300 все приводят к результату 10:05 ,

Аналогично, если две цифры оказываются равными нулю. Вход 36000 дает выход 10:, а входы 600 и 10 оба являются результатом 10.

Вот как я бы идти о реализации этой функции:

<xsl:template name="format-duration"> 
    <xsl:param name="value" select="." /> 
    <xsl:param name="alwaysIncludeHours" select="false()" /> 
    <xsl:param name="includeSeconds" select="true()" /> 

    <xsl:if test="$value > 3600 or $alwaysIncludeHours"> 
     <xsl:value-of select="concat(format-number($value div 3600, '00'), ':')"/> 
    </xsl:if> 

    <xsl:value-of select="format-number(floor($value div 60) mod 60, '00')" /> 

    <xsl:if test="$includeSeconds"> 
     <xsl:value-of select="concat(':', format-number($value mod 60, '00'))" /> 
    </xsl:if> 
    </xsl:template> 

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

Он также позволяет исключить параметр value, если значение, которое вы хотите форматировать, является текущим узлом контекста.

+0

Мне пришлось изменить минуты на это: '' Спасибо большое, хотя, действительно помог мне out;) –

+0

@ net.uk.sweet Что произошло, когда вы пробовали мой подход? Кажется, он должен работать нормально. – JLRishe

+1

** Эта формула неверна **: 90 секунд должны возвращать '01: 30', а не' 02: 30'. –

2

Преобразование количества секунд времени (HH: MM: SS) в XSLT 1.0:

<xsl:template name="seconds-to-time"> 
    <xsl:param name="seconds"/> 
    <xsl:variable name="h" select="floor($seconds div 3600)"/> 
    <xsl:variable name="m" select="floor($seconds div 60) mod 60"/> 
    <xsl:variable name="s" select="$seconds mod 60"/> 

    <xsl:value-of select="format-number($h, '00')" /> 
    <xsl:value-of select="format-number($m, ':00')" /> 
    <xsl:value-of select="format-number($s, ':00')" /> 
</xsl:template> 
Смежные вопросы