У меня есть формула 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)
и если это ложно, остальная часть выражения не оценивается.
Есть ли приоритет порядка, основанный на скобках, которые я должен использовать?