Порядок оценки условий в формуле XPath 2.0 - PullRequest
0 голосов
/ 12 февраля 2019

У меня есть формула XPath 2.0 с использованием переменных XPath.Формула находится в конструкции if-then-else.

В самом условии if есть несколько условий.Я ставлю условия в том порядке, в котором я хочу, чтобы они оценивались.

Вот моя формула:

if (empty($NetCashFlowFromInvestingActivities) and exists($NetCashFlowFromOperatingActivities) and exists($NetCashFlowFromFinancingActivities) and exists($NetCashFlow) and not($NetCashFlow - ($NetCashFlowFromOperatingActivities + $NetCashFlowFromFinancingActivities + (if (exists($ExchangeGainsLosses)) then $ExchangeGainsLosses else 0)) = 0)) then ($NetCashFlow - ($NetCashFlowFromOperatingActivities + $NetCashFlowFromFinancingActivities + (if (exists($ExchangeGainsLosses)) then $ExchangeGainsLosses else 0))) else ()

Данные, передаваемые в elementpath в формате Python dict:

{
 'NetCashFlow': None,
 'NetCashFlowFromFinancingActivities': 369100000,
 'NetCashFlowFromFinancingActivitiesContinuing': 369100000,
 'NetCashFlowFromInvestingActivities': -460300000,
 'NetCashFlowFromOperatingActivities': 207400000
}

Вот исходный код xml:

<root>
  <formula>
    <variable name="Equity" select="if (empty($Equity) and exists(($EquityAttributableToParent, $EquityAttributableToNoncontrollingInterest))) then sum(($EquityAttributableToParent, $EquityAttributableToNoncontrollingInterest)) else ()"/>
    <variable name="OperatingMargin" select="if ((not(exists($OperatingMargin))) and (exists($Revenues) and exists($OperatingExpense))) then (sum(($Revenues, -$OperatingExpense))) else $OperatingMargin"/>
    <variable name="NetCashFlowFromInvestingActivities" select="if (empty($NetCashFlowFromInvestingActivities) and exists($NetCashFlowFromOperatingActivities) and exists($NetCashFlowFromFinancingActivities) and exists($NetCashFlow) and not($NetCashFlow - ($NetCashFlowFromOperatingActivities + $NetCashFlowFromFinancingActivities + (if (exists($ExchangeGainsLosses)) then $ExchangeGainsLosses else 0)) = 0)) then ($NetCashFlow - ($NetCashFlowFromOperatingActivities + $NetCashFlowFromFinancingActivities + (if (exists($ExchangeGainsLosses)) then $ExchangeGainsLosses else 0))) else ()"/>
  </formula>
</root>

Я использую пакет elementpath в Python 3.6 для оценки XPath 2.0, так как это был единственный способ найти XPath 2.0 в Python.

В моей формуле:

Сначала я проверяю exists($NetCashFlow), а затем пытаюсь проверить: and not($NetCashFlow - ($NetCashFlowFromOperatingActivities + $NetCashFlowFromFinancingActivities + (if (exists($ExchangeGainsLosses)) then $ExchangeGainsLosses else 0)) = 0)

Я предположил, что если $ NetCashFlow равен нулю, следующее выражение будетне оцениваться.Но я получаю сообщение об ошибке, в котором говорится, что я пытаюсь выполнить операцию с несуществующим значением, т. Е. $ NetCashFlow - ...

Как мне написать эту формулу, чтобы сначала проверялась exists($NetCashFlow)и если это ложно, остальная часть выражения не оценивается.

Есть ли приоритет порядка, основанный на скобках, которые я должен использовать?

...