2014-04-10 6 views
0

Я хотел был бы форматировать числа к HH: mm в XLS. Основная проблема заключается в том, что входной номер равен 810 (-> 8:10) и 1530 (-> 15:30) Как я могу это сделать?Как я могу форматировать время в XSL

Я пытался использовать это:

<xsl:choose> 
    <xsl:when test="string-length(IND)=4"> 
     <!--<td><xsl:value-of select="IND"></xsl:value-of></td>--> 
     <td><xsl:value-of select="format-time(IND, 'HH:mm')"/></td> 
    </xsl:when> ... 

Но это падение ошибка: XML-22018: (Error) Синтаксическая ошибка в функции формата времени.

+0

'8: 10' не HH: мм. –

ответ

0

Как об этом:

<xsl:variable name="hrLen" select="string-length(IND) - 2" /> 
<td><xsl:value-of select="concat(substring(IND, 1, $hrLen), 
           ':', 
           substring(IND, $hrLen + 1))" /> 
0

Попробуйте при использовании XSL двигатель от Microsoft:

<xsl:template match="Time"> 
    <xsl:copy> 
    <xsl:value-of select="format-number(text(),'00:00')"/> 
    </xsl:copy> 
</xsl:template> 

Или это для других XSL двигателей, включая MS (рекомендуется):

<xsl:template name="FormatTime"> 
    <xsl:param name="numericTime" select="0" /> 
    <xsl:variable name="fourDigitString" select="format-number($numericTime,'0000')"/> 
    <xsl:value-of select="concat(substring($fourDigitString,1,2),':',substring($fourDigitString,3,2))"/> 
</xsl:template> 

Полный пример:

XSLT

<?xml version="1.0" encoding="utf-8"?> 
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform" 
    xmlns:msxsl="urn:schemas-microsoft-com:xslt" exclude-result-prefixes="msxsl" 
> 
    <xsl:output method="xml" indent="yes"/> 

    <xsl:template match="@* | node()"> 
    <xsl:copy> 
     <xsl:apply-templates select="@* | node()"/> 
    </xsl:copy> 
    </xsl:template> 

    <xsl:template match="Time"> 
    <xsl:text>&#10;</xsl:text> 
    <xsl:element name="Universal"> 
     <xsl:copy> 
     <xsl:call-template name="FormatTime"> 
      <xsl:with-param name="numericTime" select="text()" /> 
     </xsl:call-template> 
     </xsl:copy> 
    </xsl:element> 
    <xsl:text>&#10;</xsl:text> 
    <xsl:element name="MicrosoftAndMaybeOthers"> 
     <xsl:copy> 
     <xsl:value-of select="format-number(text(),'00:00')"/> 
     </xsl:copy> 
    </xsl:element> 
    <xsl:text>&#10;</xsl:text> 

    </xsl:template> 
    <xsl:template name="FormatTime"> 
    <xsl:param name="numericTime" select="0" /> 
    <xsl:variable name="fourDigitString" select="format-number($numericTime,'0000')"/> 
    <xsl:value-of select="concat(substring($fourDigitString,1,2),':',substring($fourDigitString,3,2))"/> 
    </xsl:template> 


</xsl:stylesheet> 

XML

<?xml version="1.0" encoding="utf-8" ?> 
<Root> 
    <Time>810</Time> 
    <Time>1538</Time> 
</Root> 

Более подробную информацию о функции: http://www.w3schools.com/xsl/func_formatnumber.asp

+0

Я не думаю, что это сработает, если вы (1) сначала не разделите число на 100, а (2) определите пользовательский десятичный формат, где ':' - десятичный разделитель. Или ... (см. Мой ответ) –

+0

Согласен - я тестировал в Visual Studio, и это сработало, но на XSLFiddle это дало неправильные результаты. Теперь я предоставил универсальное решение. – JohnLBevan

1

Try:

<xsl:value-of select="translate(format-number(IND div 100,'00.00'), '.', ':')"/> 
0

Вы звоните формат времени(). Это функция XSLT 2.0. Используете ли вы процессор XSLT 2.0? - вы не говорите, и странно, никто не спросил.

Если вы используете XSLT 2.0, то вы можете вызвать эту функцию

format-time($time, '[H01]:[m01]') 

Однако сначала нужно построить $ время как хз: значение времени. Начиная с номера 810, вы должны сделать xs:time('00:00:00') + ((($n idiv 100) * 60) + ($n mod 100))*xs:dayTimeDuration('PT1M') - это немного большая работа, чтобы вставить двоеточие.

Так что я думаю, что мое предпочтительное решение +2,0, вероятно, будет

replace(string($N), '(\d\d)$', ':$1') 
Смежные вопросы