Как я могу вычислить абсолютное значение числа в XSLT?

У меня есть

<xsl:value-of select="DifferenceInDays" /> 

DifferenceInDays имеет значение, которое может быть отрицательным или положительным числом, я хочу отобразить его абсолютное значение. Как я могу это сделать?


person Mithil    schedule 29.04.2009    source источник
comment
Может быть, вы могли бы принять ответ?   -  person Dimitre Novatchev    schedule 24.10.2020


Ответы (4)


В XPath 1.0 используйте следующее выражение:

   $vNum*($vNum >=0) - $vNum*($vNum < 0)

Если это выражение встроено в атрибут XSLT (XML), символ < должен быть экранирован:

   $vNum*($vNum >=0) - $vNum*($vNum &lt; 0)

В XPath 2.0 (XSLT 2.0) используйте функцию abs(). .

person Dimitre Novatchev    schedule 29.04.2009

Этого можно добиться с помощью функции xpath abs.

<xsl:value-of select="abs(DifferenceInDays)"/>
person Jory    schedule 29.04.2009
comment
это XPath 2.0, которого в принципе не существует. - person MushyPeas; 26.04.2020

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

<xsl:value-of select='format-number(DifferenceInDays,"0;0")'/>

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

person Jon Mifsud    schedule 22.08.2014
comment
должно работать, насколько я знаю. Функциональность формата числа предоставляется в спецификации XSLT 1.0. - person Jon Mifsud; 22.08.2014
comment
Вы тестировали это с каким-либо одним из них? Если да, то в каком сработало? - person michael.hor257k; 22.08.2014
comment
проверено и использовано в XSLT 1.0, обработанном с помощью PHP. Я использовал тот же трюк для форматирования отрицательных чисел, чтобы показать их в скобках, а не с отрицательным числом, поскольку это правильный формат для финансовых учреждений. - person Jon Mifsud; 22.08.2014
comment
Вы не отвечаете на мой вопрос. PHP не является процессором XSLT. Xalan-J, Saxon 6.5 и libxslt. Это не работает ни в одном из трех. - person michael.hor257k; 22.08.2014
comment
он определенно работает в LibXSLT (единственный процессор, поддерживающий PHP) - только что попробовал. И вы можете найти информацию о том, как работает номер формата в W3 Schools, это довольно просто w3schools.com/ xsl/func_formatnumber.asp - person Jon Mifsud; 22.08.2014
comment
Я знаю, как работает format-number(). И моя информация не поступает из школ W3. Однако он не работает на мой libxslt, и если вы щелкнете по приведенным выше ссылкам, то увидите, что он не работает и на двух других процессорах. Вопрос о том, является ли это правильной интерпретацией спецификации XSLT 1.0 (которая на самом деле является спецификацией JDK 1.1), остается открытым, но факт остается фактом: так думали все три поставщика. - person michael.hor257k; 22.08.2014
comment
кажется странным, что он несовместим с самой libxslt. Посмотрим, есть ли другой способ проверить это. Я думаю, что маловероятно, что он будет привязан к чему-то другому, кроме процессора libxslt. - person Jon Mifsud; 22.08.2014
comment
Также просто для справки Saxon 9 по предоставленным вами ссылкам - пример, который я привел, также работает. Так что, скорее всего, это была неверная интерпретация спецификации по сравнению с предыдущими версиями. - person Jon Mifsud; 22.08.2014
comment
Да, он работает в Saxon 9, который представляет собой процессор XSLT 2.0, поэтому соответствует другой спецификации. В любом случае, если вам нужно простое решение, использующее манипуляции со строками, которое работает повсеместно, попробуйте translate($number, '-', ''). - person michael.hor257k; 22.08.2014

diffInDays * (1 - 2*(diffInDays 0))

person Community    schedule 04.05.2009