Мод Операции для Отрицательного числа XSLT - PullRequest
0 голосов
/ 25 октября 2019

Я пытаюсь поместить логику в XSL, чтобы получить значение.

1+ mod(DateDifference ,number)

DateDifference может быть положительным или отрицательным числом, и формула должна работать во всех сценариях, независимо от того, является ли разность дат +ve, -ve или 0.

Эта формулав XSL не работает для значений ниже

DateDifference= -33
Number=8

Результат, который я получаю в MS Excel с той же формулой: 7, но результат XSL -1.

МожетКто-нибудь предложить мне правильный способ или синтаксис для использования числа для всех возможных DateDifference значений?

Ответы [ 2 ]

2 голосов
/ 25 октября 2019

Различные языки используют разные определения для операций по модулю. В большинстве языков программирования функция mod определяется как:

n mod d  =  n - d * trunc(n / d) 

(где trunc() означает усечение до 0 десятичных знаков), и это также алгоритм, реализованный в XSLT.

Дональд Кнут предложил:

n mod d  =  n - d * floor(n / d) 

, и этот алгоритм в настоящее время реализован в Excel. Чтобы получить тот же результат в XSLT, используйте:

n - d * floor(n div d)
0 голосов
/ 25 октября 2019

Для работы с негативным и позитивным модом в XSL

<xsl:function name="fun:mod" as="xs:string">
        <xsl:param name="int1" as="xs:integer"/>
        <xsl:param name="int2" as="xs:integer"/>
        <xsl:value-of select="($int1 mod $int2 + $int2) mod $int2"/>


    </xsl:function>
...