diff --git a/test/files/huge-xpath-query.txt b/test/files/huge-xpath-query.txt new file mode 100644 index 0000000000..edcdf0dd43 --- /dev/null +++ b/test/files/huge-xpath-query.txt @@ -0,0 +1 @@ +( (((sum(ct:AIACapitalAllowancesInc) + sum(../ct:NotIncluded/ct:AIACapitalAllowancesNotInc))) - (( ( ceiling( ( number((round(date:seconds(normalize-space('2015-04-01')) div 86400) <= round(date:seconds(normalize-space(../ct:CompanyInformation/ct:PeriodCovered/ct:To)) div 86400))) * number((round(date:seconds(normalize-space(../ct:CompanyInformation/ct:PeriodCovered/ct:From)) div 86400) < round(date:seconds(normalize-space('2016-01-01')) div 86400))) * ( ( number((round(date:seconds(normalize-space('2015-04-01')) div 86400) <= round(date:seconds(normalize-space(../ct:CompanyInformation/ct:PeriodCovered/ct:From)) div 86400))) * number((round(date:seconds(normalize-space(../ct:CompanyInformation/ct:PeriodCovered/ct:To)) div 86400) < round(date:seconds(normalize-space('2016-01-01')) div 86400))) * (round(date:seconds(normalize-space(date:add(normalize-space(../ct:CompanyInformation/ct:PeriodCovered/ct:To),normalize-space('P1D')))) div 86400) - round(date:seconds(normalize-space(../ct:CompanyInformation/ct:PeriodCovered/ct:From)) div 86400)) ) + ( number((round(date:seconds(normalize-space(../ct:CompanyInformation/ct:PeriodCovered/ct:From)) div 86400) < round(date:seconds(normalize-space('2015-04-01')) div 86400))) * number((round(date:seconds(normalize-space(../ct:CompanyInformation/ct:PeriodCovered/ct:To)) div 86400) < round(date:seconds(normalize-space('2016-01-01')) div 86400))) * (round(date:seconds(normalize-space(date:add(normalize-space(../ct:CompanyInformation/ct:PeriodCovered/ct:To),normalize-space('P1D')))) div 86400) - round(date:seconds(normalize-space('2015-04-01')) div 86400)) ) + ( number((round(date:seconds(normalize-space('2015-04-01')) div 86400) <= round(date:seconds(normalize-space(../ct:CompanyInformation/ct:PeriodCovered/ct:From)) div 86400))) * number((round(date:seconds(normalize-space('2016-01-01')) div 86400) <= round(date:seconds(normalize-space(../ct:CompanyInformation/ct:PeriodCovered/ct:To)) div 86400))) * (round(date:seconds(normalize-space('2016-01-01')) div 86400) - round(date:seconds(normalize-space(../ct:CompanyInformation/ct:PeriodCovered/ct:From)) div 86400)) ) + ( number((round(date:seconds(normalize-space(../ct:CompanyInformation/ct:PeriodCovered/ct:From)) div 86400) < round(date:seconds(normalize-space('2015-04-01')) div 86400))) * number((round(date:seconds(normalize-space('2016-01-01')) div 86400) <= round(date:seconds(normalize-space(../ct:CompanyInformation/ct:PeriodCovered/ct:To)) div 86400))) * (round(date:seconds(normalize-space('2016-01-01')) div 86400) - round(date:seconds(normalize-space('2015-04-01')) div 86400)) ) ) * 500000 div (366 - number( ( ( (round(date:seconds(normalize-space(../ct:CompanyInformation/ct:PeriodCovered/ct:From)) div 86400) < round(date:seconds(normalize-space('2015-04-01')) div 86400)) and (round(date:seconds(normalize-space('2015-04-01')) div 86400) <= round(date:seconds(normalize-space(../ct:CompanyInformation/ct:PeriodCovered/ct:To)) div 86400)) ) or ( (round(date:seconds(normalize-space(../ct:CompanyInformation/ct:PeriodCovered/ct:From)) div 86400) < round(date:seconds(normalize-space('2016-01-01')) div 86400)) and (round(date:seconds(normalize-space('2016-01-01')) div 86400) <= round(date:seconds(normalize-space(../ct:CompanyInformation/ct:PeriodCovered/ct:To)) div 86400)) ) or ( (round(date:seconds(normalize-space(../ct:CompanyInformation/ct:PeriodCovered/ct:From)) div 86400) < round(date:seconds(normalize-space('2019-01-01')) div 86400)) and (round(date:seconds(normalize-space('2019-01-01')) div 86400) <= round(date:seconds(normalize-space(../ct:CompanyInformation/ct:PeriodCovered/ct:To)) div 86400)) ) or ( (round(date:seconds(normalize-space(../ct:CompanyInformation/ct:PeriodCovered/ct:From)) div 86400) < round(date:seconds(normalize-space('2022-01-01')) div 86400)) and (round(date:seconds(normalize-space('2022-01-01')) div 86400) <= round(date:seconds(normalize-space(../ct:CompanyInformation/ct:PeriodCovered/ct:To)) div 86400)) ) ) or ((round(date:seconds(normalize-space(../ct:CompanyInformation/ct:PeriodCovered/ct:To)) div 86400) - round(date:seconds(normalize-space(../ct:CompanyInformation/ct:PeriodCovered/ct:From)) div 86400)) + 1 < 366) )) ) ) + ceiling( ( number((round(date:seconds(normalize-space('2016-01-01')) div 86400) <= round(date:seconds(normalize-space(../ct:CompanyInformation/ct:PeriodCovered/ct:To)) div 86400))) * number((round(date:seconds(normalize-space(../ct:CompanyInformation/ct:PeriodCovered/ct:From)) div 86400) < round(date:seconds(normalize-space('2019-01-01')) div 86400))) * ( ( number((round(date:seconds(normalize-space('2016-01-01')) div 86400) <= round(date:seconds(normalize-space(../ct:CompanyInformation/ct:PeriodCovered/ct:From)) div 86400))) * number((round(date:seconds(normalize-space(../ct:CompanyInformation/ct:PeriodCovered/ct:To)) div 86400) < round(date:seconds(normalize-space('2019-01-01')) div 86400))) * (round(date:seconds(normalize-space(date:add(normalize-space(../ct:CompanyInformation/ct:PeriodCovered/ct:To),normalize-space('P1D')))) div 86400) - round(date:seconds(normalize-space(../ct:CompanyInformation/ct:PeriodCovered/ct:From)) div 86400)) ) + ( number((round(date:seconds(normalize-space(../ct:CompanyInformation/ct:PeriodCovered/ct:From)) div 86400) < round(date:seconds(normalize-space('2016-01-01')) div 86400))) * number((round(date:seconds(normalize-space(../ct:CompanyInformation/ct:PeriodCovered/ct:To)) div 86400) < round(date:seconds(normalize-space('2019-01-01')) div 86400))) * (round(date:seconds(normalize-space(date:add(normalize-space(../ct:CompanyInformation/ct:PeriodCovered/ct:To),normalize-space('P1D')))) div 86400) - round(date:seconds(normalize-space('2016-01-01')) div 86400)) ) + ( number((round(date:seconds(normalize-space('2016-01-01')) div 86400) <= round(date:seconds(normalize-space(../ct:CompanyInformation/ct:PeriodCovered/ct:From)) div 86400))) * number((round(date:seconds(normalize-space('2019-01-01')) div 86400) <= round(date:seconds(normalize-space(../ct:CompanyInformation/ct:PeriodCovered/ct:To)) div 86400))) * (round(date:seconds(normalize-space('2019-01-01')) div 86400) - round(date:seconds(normalize-space(../ct:CompanyInformation/ct:PeriodCovered/ct:From)) div 86400)) ) + ( number((round(date:seconds(normalize-space(../ct:CompanyInformation/ct:PeriodCovered/ct:From)) div 86400) < round(date:seconds(normalize-space('2016-01-01')) div 86400))) * number((round(date:seconds(normalize-space('2019-01-01')) div 86400) <= round(date:seconds(normalize-space(../ct:CompanyInformation/ct:PeriodCovered/ct:To)) div 86400))) * (round(date:seconds(normalize-space('2019-01-01')) div 86400) - round(date:seconds(normalize-space('2016-01-01')) div 86400)) ) ) * 200000 div (366 - number( ( ( (round(date:seconds(normalize-space(../ct:CompanyInformation/ct:PeriodCovered/ct:From)) div 86400) < round(date:seconds(normalize-space('2015-04-01')) div 86400)) and (round(date:seconds(normalize-space('2015-04-01')) div 86400) <= round(date:seconds(normalize-space(../ct:CompanyInformation/ct:PeriodCovered/ct:To)) div 86400)) ) or ( (round(date:seconds(normalize-space(../ct:CompanyInformation/ct:PeriodCovered/ct:From)) div 86400) < round(date:seconds(normalize-space('2016-01-01')) div 86400)) and (round(date:seconds(normalize-space('2016-01-01')) div 86400) <= round(date:seconds(normalize-space(../ct:CompanyInformation/ct:PeriodCovered/ct:To)) div 86400)) ) or ( (round(date:seconds(normalize-space(../ct:CompanyInformation/ct:PeriodCovered/ct:From)) div 86400) < round(date:seconds(normalize-space('2019-01-01')) div 86400)) and (round(date:seconds(normalize-space('2019-01-01')) div 86400) <= round(date:seconds(normalize-space(../ct:CompanyInformation/ct:PeriodCovered/ct:To)) div 86400)) ) or ( (round(date:seconds(normalize-space(../ct:CompanyInformation/ct:PeriodCovered/ct:From)) div 86400) < round(date:seconds(normalize-space('2022-01-01')) div 86400)) and (round(date:seconds(normalize-space('2022-01-01')) div 86400) <= round(date:seconds(normalize-space(../ct:CompanyInformation/ct:PeriodCovered/ct:To)) div 86400)) ) ) or ((round(date:seconds(normalize-space(../ct:CompanyInformation/ct:PeriodCovered/ct:To)) div 86400) - round(date:seconds(normalize-space(../ct:CompanyInformation/ct:PeriodCovered/ct:From)) div 86400)) + 1 < 366) )) ) ) + ceiling( ( number((round(date:seconds(normalize-space('2019-01-01')) div 86400) <= round(date:seconds(normalize-space(../ct:CompanyInformation/ct:PeriodCovered/ct:To)) div 86400))) * number((round(date:seconds(normalize-space(../ct:CompanyInformation/ct:PeriodCovered/ct:From)) div 86400) < round(date:seconds(normalize-space('2022-01-01')) div 86400))) * ( ( number((round(date:seconds(normalize-space('2019-01-01')) div 86400) <= round(date:seconds(normalize-space(../ct:CompanyInformation/ct:PeriodCovered/ct:From)) div 86400))) * number((round(date:seconds(normalize-space(../ct:CompanyInformation/ct:PeriodCovered/ct:To)) div 86400) < round(date:seconds(normalize-space('2022-01-01')) div 86400))) * (round(date:seconds(normalize-space(date:add(normalize-space(../ct:CompanyInformation/ct:PeriodCovered/ct:To),normalize-space('P1D')))) div 86400) - round(date:seconds(normalize-space(../ct:CompanyInformation/ct:PeriodCovered/ct:From)) div 86400)) ) + ( number((round(date:seconds(normalize-space(../ct:CompanyInformation/ct:PeriodCovered/ct:From)) div 86400) < round(date:seconds(normalize-space('2019-01-01')) div 86400))) * number((round(date:seconds(normalize-space(../ct:CompanyInformation/ct:PeriodCovered/ct:To)) div 86400) < round(date:seconds(normalize-space('2022-01-01')) div 86400))) * (round(date:seconds(normalize-space(date:add(normalize-space(../ct:CompanyInformation/ct:PeriodCovered/ct:To),normalize-space('P1D')))) div 86400) - round(date:seconds(normalize-space('2019-01-01')) div 86400)) ) + ( number((round(date:seconds(normalize-space('2019-01-01')) div 86400) <= round(date:seconds(normalize-space(../ct:CompanyInformation/ct:PeriodCovered/ct:From)) div 86400))) * number((round(date:seconds(normalize-space('2022-01-01')) div 86400) <= round(date:seconds(normalize-space(../ct:CompanyInformation/ct:PeriodCovered/ct:To)) div 86400))) * (round(date:seconds(normalize-space('2022-01-01')) div 86400) - round(date:seconds(normalize-space(../ct:CompanyInformation/ct:PeriodCovered/ct:From)) div 86400)) ) + ( number((round(date:seconds(normalize-space(../ct:CompanyInformation/ct:PeriodCovered/ct:From)) div 86400) < round(date:seconds(normalize-space('2019-01-01')) div 86400))) * number((round(date:seconds(normalize-space('2022-01-01')) div 86400) <= round(date:seconds(normalize-space(../ct:CompanyInformation/ct:PeriodCovered/ct:To)) div 86400))) * (round(date:seconds(normalize-space('2022-01-01')) div 86400) - round(date:seconds(normalize-space('2019-01-01')) div 86400)) ) ) * 1000000 div (366 - number( ( ( (round(date:seconds(normalize-space(../ct:CompanyInformation/ct:PeriodCovered/ct:From)) div 86400) < round(date:seconds(normalize-space('2015-04-01')) div 86400)) and (round(date:seconds(normalize-space('2015-04-01')) div 86400) <= round(date:seconds(normalize-space(../ct:CompanyInformation/ct:PeriodCovered/ct:To)) div 86400)) ) or ( (round(date:seconds(normalize-space(../ct:CompanyInformation/ct:PeriodCovered/ct:From)) div 86400) < round(date:seconds(normalize-space('2016-01-01')) div 86400)) and (round(date:seconds(normalize-space('2016-01-01')) div 86400) <= round(date:seconds(normalize-space(../ct:CompanyInformation/ct:PeriodCovered/ct:To)) div 86400)) ) or ( (round(date:seconds(normalize-space(../ct:CompanyInformation/ct:PeriodCovered/ct:From)) div 86400) < round(date:seconds(normalize-space('2019-01-01')) div 86400)) and (round(date:seconds(normalize-space('2019-01-01')) div 86400) <= round(date:seconds(normalize-space(../ct:CompanyInformation/ct:PeriodCovered/ct:To)) div 86400)) ) or ( (round(date:seconds(normalize-space(../ct:CompanyInformation/ct:PeriodCovered/ct:From)) div 86400) < round(date:seconds(normalize-space('2022-01-01')) div 86400)) and (round(date:seconds(normalize-space('2022-01-01')) div 86400) <= round(date:seconds(normalize-space(../ct:CompanyInformation/ct:PeriodCovered/ct:To)) div 86400)) ) ) or ((round(date:seconds(normalize-space(../ct:CompanyInformation/ct:PeriodCovered/ct:To)) div 86400) - round(date:seconds(normalize-space(../ct:CompanyInformation/ct:PeriodCovered/ct:From)) div 86400)) + 1 < 366) )) ) ) + ceiling( ( number((round(date:seconds(normalize-space('2022-01-01')) div 86400) <= round(date:seconds(normalize-space(../ct:CompanyInformation/ct:PeriodCovered/ct:To)) div 86400))) * ( ( number((round(date:seconds(normalize-space('2022-01-01')) div 86400) <= round(date:seconds(normalize-space(../ct:CompanyInformation/ct:PeriodCovered/ct:From)) div 86400))) * (round(date:seconds(normalize-space(date:add(normalize-space(../ct:CompanyInformation/ct:PeriodCovered/ct:To),normalize-space('P1D')))) div 86400) - round(date:seconds(normalize-space(../ct:CompanyInformation/ct:PeriodCovered/ct:From)) div 86400)) ) + ( number((round(date:seconds(normalize-space(../ct:CompanyInformation/ct:PeriodCovered/ct:From)) div 86400) < round(date:seconds(normalize-space('2022-01-01')) div 86400))) * (round(date:seconds(normalize-space(date:add(normalize-space(../ct:CompanyInformation/ct:PeriodCovered/ct:To),normalize-space('P1D')))) div 86400) - round(date:seconds(normalize-space('2022-01-01')) div 86400)) ) ) * 200000 div (366 - number( ( ( (round(date:seconds(normalize-space(../ct:CompanyInformation/ct:PeriodCovered/ct:From)) div 86400) < round(date:seconds(normalize-space('2015-04-01')) div 86400)) and (round(date:seconds(normalize-space('2015-04-01')) div 86400) <= round(date:seconds(normalize-space(../ct:CompanyInformation/ct:PeriodCovered/ct:To)) div 86400)) ) or ( (round(date:seconds(normalize-space(../ct:CompanyInformation/ct:PeriodCovered/ct:From)) div 86400) < round(date:seconds(normalize-space('2016-01-01')) div 86400)) and (round(date:seconds(normalize-space('2016-01-01')) div 86400) <= round(date:seconds(normalize-space(../ct:CompanyInformation/ct:PeriodCovered/ct:To)) div 86400)) ) or ( (round(date:seconds(normalize-space(../ct:CompanyInformation/ct:PeriodCovered/ct:From)) div 86400) < round(date:seconds(normalize-space('2019-01-01')) div 86400)) and (round(date:seconds(normalize-space('2019-01-01')) div 86400) <= round(date:seconds(normalize-space(../ct:CompanyInformation/ct:PeriodCovered/ct:To)) div 86400)) ) or ( (round(date:seconds(normalize-space(../ct:CompanyInformation/ct:PeriodCovered/ct:From)) div 86400) < round(date:seconds(normalize-space('2022-01-01')) div 86400)) and (round(date:seconds(normalize-space('2022-01-01')) div 86400) <= round(date:seconds(normalize-space(../ct:CompanyInformation/ct:PeriodCovered/ct:To)) div 86400)) ) ) or ((round(date:seconds(normalize-space(../ct:CompanyInformation/ct:PeriodCovered/ct:To)) div 86400) - round(date:seconds(normalize-space(../ct:CompanyInformation/ct:PeriodCovered/ct:From)) div 86400)) + 1 < 366) )) ) ) ) )) < 0.001) ) or ( ( date:day-in-month(normalize-space(../ct:CompanyInformation/ct:PeriodCovered/ct:From)) = 1 and date:day-in-month(normalize-space(date:add(normalize-space(../ct:CompanyInformation/ct:PeriodCovered/ct:To),normalize-space('P1DT12H')))) = 1 ) and ( (((sum(ct:AIACapitalAllowancesInc) + sum(../ct:NotIncluded/ct:AIACapitalAllowancesNotInc))) - ((( ceiling( ( number((round(date:seconds(normalize-space('2015-04-01')) div 86400) <= round(date:seconds(normalize-space(../ct:CompanyInformation/ct:PeriodCovered/ct:To)) div 86400))) * number((round(date:seconds(normalize-space(../ct:CompanyInformation/ct:PeriodCovered/ct:From)) div 86400) < round(date:seconds(normalize-space('2016-01-01')) div 86400))) * ( ( number((round(date:seconds(normalize-space('2015-04-01')) div 86400) <= round(date:seconds(normalize-space(../ct:CompanyInformation/ct:PeriodCovered/ct:From)) div 86400))) * number((round(date:seconds(normalize-space(../ct:CompanyInformation/ct:PeriodCovered/ct:To)) div 86400) < round(date:seconds(normalize-space('2016-01-01')) div 86400))) * (12 * (date:year(date:add(normalize-space(../ct:CompanyInformation/ct:PeriodCovered/ct:To),normalize-space('P1D'))) - date:year(../ct:CompanyInformation/ct:PeriodCovered/ct:From)) + date:month-in-year(date:add(normalize-space(../ct:CompanyInformation/ct:PeriodCovered/ct:To),normalize-space('P1D'))) - date:month-in-year(../ct:CompanyInformation/ct:PeriodCovered/ct:From)) ) + ( number((round(date:seconds(normalize-space(../ct:CompanyInformation/ct:PeriodCovered/ct:From)) div 86400) < round(date:seconds(normalize-space('2015-04-01')) div 86400))) * number((round(date:seconds(normalize-space(../ct:CompanyInformation/ct:PeriodCovered/ct:To)) div 86400) < round(date:seconds(normalize-space('2016-01-01')) div 86400))) * (12 * (date:year(date:add(normalize-space(../ct:CompanyInformation/ct:PeriodCovered/ct:To),normalize-space('P1D'))) - date:year('2015-04-01')) + date:month-in-year(date:add(normalize-space(../ct:CompanyInformation/ct:PeriodCovered/ct:To),normalize-space('P1D'))) - date:month-in-year('2015-04-01')) ) + ( number((round(date:seconds(normalize-space('2015-04-01')) div 86400) <= round(date:seconds(normalize-space(../ct:CompanyInformation/ct:PeriodCovered/ct:From)) div 86400))) * number((round(date:seconds(normalize-space('2016-01-01')) div 86400) <= round(date:seconds(normalize-space(../ct:CompanyInformation/ct:PeriodCovered/ct:To)) div 86400))) * (12 * (date:year('2016-01-01') - date:year(../ct:CompanyInformation/ct:PeriodCovered/ct:From)) + date:month-in-year('2016-01-01') - date:month-in-year(../ct:CompanyInformation/ct:PeriodCovered/ct:From)) ) + ( number((round(date:seconds(normalize-space(../ct:CompanyInformation/ct:PeriodCovered/ct:From)) div 86400) < round(date:seconds(normalize-space('2015-04-01')) div 86400))) * number((round(date:seconds(normalize-space('2016-01-01')) div 86400) <= round(date:seconds(normalize-space(../ct:CompanyInformation/ct:PeriodCovered/ct:To)) div 86400))) * (12 * (date:year('2016-01-01') - date:year('2015-04-01')) + date:month-in-year('2016-01-01') - date:month-in-year('2015-04-01')) ) ) * 500000 div 12 ) ) + ceiling( ( number((round(date:seconds(normalize-space('2016-01-01')) div 86400) <= round(date:seconds(normalize-space(../ct:CompanyInformation/ct:PeriodCovered/ct:To)) div 86400))) * number((round(date:seconds(normalize-space(../ct:CompanyInformation/ct:PeriodCovered/ct:From)) div 86400) < round(date:seconds(normalize-space('2019-01-01')) div 86400))) * ( ( number((round(date:seconds(normalize-space('2016-01-01')) div 86400) <= round(date:seconds(normalize-space(../ct:CompanyInformation/ct:PeriodCovered/ct:From)) div 86400))) * number((round(date:seconds(normalize-space(../ct:CompanyInformation/ct:PeriodCovered/ct:To)) div 86400) < round(date:seconds(normalize-space('2019-01-01')) div 86400))) * (12 * (date:year(date:add(normalize-space(../ct:CompanyInformation/ct:PeriodCovered/ct:To),normalize-space('P1D'))) - date:year(../ct:CompanyInformation/ct:PeriodCovered/ct:From)) + date:month-in-year(date:add(normalize-space(../ct:CompanyInformation/ct:PeriodCovered/ct:To),normalize-space('P1D'))) - date:month-in-year(../ct:CompanyInformation/ct:PeriodCovered/ct:From)) ) + ( number((round(date:seconds(normalize-space(../ct:CompanyInformation/ct:PeriodCovered/ct:From)) div 86400) < round(date:seconds(normalize-space('2016-01-01')) div 86400))) * number((round(date:seconds(normalize-space(../ct:CompanyInformation/ct:PeriodCovered/ct:To)) div 86400) < round(date:seconds(normalize-space('2019-01-01')) div 86400))) * (12 * (date:year(date:add(normalize-space(../ct:CompanyInformation/ct:PeriodCovered/ct:To),normalize-space('P1D'))) - date:year('2016-01-01')) + date:month-in-year(date:add(normalize-space(../ct:CompanyInformation/ct:PeriodCovered/ct:To),normalize-space('P1D'))) - date:month-in-year('2016-01-01')) ) + ( number((round(date:seconds(normalize-space('2016-01-01')) div 86400) <= round(date:seconds(normalize-space(../ct:CompanyInformation/ct:PeriodCovered/ct:From)) div 86400))) * number((round(date:seconds(normalize-space('2019-01-01')) div 86400) <= round(date:seconds(normalize-space(../ct:CompanyInformation/ct:PeriodCovered/ct:To)) div 86400))) * (12 * (date:year('2019-01-01') - date:year(../ct:CompanyInformation/ct:PeriodCovered/ct:From)) + date:month-in-year('2019-01-01') - date:month-in-year(../ct:CompanyInformation/ct:PeriodCovered/ct:From)) ) + ( number((round(date:seconds(normalize-space(../ct:CompanyInformation/ct:PeriodCovered/ct:From)) div 86400) < round(date:seconds(normalize-space('2016-01-01')) div 86400))) * number((round(date:seconds(normalize-space('2019-01-01')) div 86400) <= round(date:seconds(normalize-space(../ct:CompanyInformation/ct:PeriodCovered/ct:To)) div 86400))) * (12 * (date:year('2019-01-01') - date:year('2016-01-01')) + date:month-in-year('2019-01-01') - date:month-in-year('2016-01-01')) ) ) * 200000 div 12 ) ) + ceiling( ( number((round(date:seconds(normalize-space('2019-01-01')) div 86400) <= round(date:seconds(normalize-space(../ct:CompanyInformation/ct:PeriodCovered/ct:To)) div 86400))) * number((round(date:seconds(normalize-space(../ct:CompanyInformation/ct:PeriodCovered/ct:From)) div 86400) < round(date:seconds(normalize-space('2022-01-01')) div 86400))) * ( ( number((round(date:seconds(normalize-space('2019-01-01')) div 86400) <= round(date:seconds(normalize-space(../ct:CompanyInformation/ct:PeriodCovered/ct:From)) div 86400))) * number((round(date:seconds(normalize-space(../ct:CompanyInformation/ct:PeriodCovered/ct:To)) div 86400) < round(date:seconds(normalize-space('2022-01-01')) div 86400))) * (12 * (date:year(date:add(normalize-space(../ct:CompanyInformation/ct:PeriodCovered/ct:To),normalize-space('P1D'))) - date:year(../ct:CompanyInformation/ct:PeriodCovered/ct:From)) + date:month-in-year(date:add(normalize-space(../ct:CompanyInformation/ct:PeriodCovered/ct:To),normalize-space('P1D'))) - date:month-in-year(../ct:CompanyInformation/ct:PeriodCovered/ct:From)) ) + ( number((round(date:seconds(normalize-space(../ct:CompanyInformation/ct:PeriodCovered/ct:From)) div 86400) < round(date:seconds(normalize-space('2019-01-01')) div 86400))) * number((round(date:seconds(normalize-space(../ct:CompanyInformation/ct:PeriodCovered/ct:To)) div 86400) < round(date:seconds(normalize-space('2022-01-01')) div 86400))) * (12 * (date:year(date:add(normalize-space(../ct:CompanyInformation/ct:PeriodCovered/ct:To),normalize-space('P1D'))) - date:year('2019-01-01')) + date:month-in-year(date:add(normalize-space(../ct:CompanyInformation/ct:PeriodCovered/ct:To),normalize-space('P1D'))) - date:month-in-year('2019-01-01')) ) + ( number((round(date:seconds(normalize-space('2019-01-01')) div 86400) <= round(date:seconds(normalize-space(../ct:CompanyInformation/ct:PeriodCovered/ct:From)) div 86400))) * number((round(date:seconds(normalize-space('2022-01-01')) div 86400) <= round(date:seconds(normalize-space(../ct:CompanyInformation/ct:PeriodCovered/ct:To)) div 86400))) * (12 * (date:year('2022-01-01') - date:year(../ct:CompanyInformation/ct:PeriodCovered/ct:From)) + date:month-in-year('2022-01-01') - date:month-in-year(../ct:CompanyInformation/ct:PeriodCovered/ct:From)) ) + ( number((round(date:seconds(normalize-space(../ct:CompanyInformation/ct:PeriodCovered/ct:From)) div 86400) < round(date:seconds(normalize-space('2019-01-01')) div 86400))) * number((round(date:seconds(normalize-space('2022-01-01')) div 86400) <= round(date:seconds(normalize-space(../ct:CompanyInformation/ct:PeriodCovered/ct:To)) div 86400))) * (12 * (date:year('2022-01-01') - date:year('2019-01-01')) + date:month-in-year('2022-01-01') - date:month-in-year('2019-01-01')) ) ) * 1000000 div 12 ) ) + ceiling( ( number((round(date:seconds(normalize-space('2022-01-01')) div 86400) <= round(date:seconds(normalize-space(../ct:CompanyInformation/ct:PeriodCovered/ct:To)) div 86400))) * ( ( number((round(date:seconds(normalize-space('2022-01-01')) div 86400) <= round(date:seconds(normalize-space(../ct:CompanyInformation/ct:PeriodCovered/ct:From)) div 86400))) * (12 * (date:year(date:add(normalize-space(../ct:CompanyInformation/ct:PeriodCovered/ct:To),normalize-space('P1D'))) - date:year(../ct:CompanyInformation/ct:PeriodCovered/ct:From)) + date:month-in-year(date:add(normalize-space(../ct:CompanyInformation/ct:PeriodCovered/ct:To),normalize-space('P1D'))) - date:month-in-year(../ct:CompanyInformation/ct:PeriodCovered/ct:From)) ) + ( number((round(date:seconds(normalize-space(../ct:CompanyInformation/ct:PeriodCovered/ct:From)) div 86400) < round(date:seconds(normalize-space('2022-01-01')) div 86400))) * (12 * (date:year(date:add(normalize-space(../ct:CompanyInformation/ct:PeriodCovered/ct:To),normalize-space('P1D'))) - date:year('2022-01-01')) + date:month-in-year(date:add(normalize-space(../ct:CompanyInformation/ct:PeriodCovered/ct:To),normalize-space('P1D'))) - date:month-in-year('2022-01-01')) ) ) * 200000 div 12 ) ) ) )) < 0.001) ) ) diff --git a/test/xml/test_xpath.rb b/test/xml/test_xpath.rb index fe22646ba1..504a30caa8 100644 --- a/test/xml/test_xpath.rb +++ b/test/xml/test_xpath.rb @@ -470,6 +470,27 @@ def test_xpath_syntax_error end end + def test_huge_xpath_query + if Nokogiri.uses_libxml?("~>2.9.11") && !Nokogiri::VERSION_INFO["libxml"]["patches"]&.include?("0007-Fix-XPath-recursion-limit.patch") + skip("libxml2 under test is broken with respect to xpath query recusion depth") + end + + # real world example + # from https://github.com/sparklemotion/nokogiri/issues/2257 + query = File.read(File.join(ASSETS_DIR, 'huge-xpath-query.txt')) + + doc = Nokogiri::XML::Document.parse("") + handler = Class.new do + def seconds(context) + 42 + end + def add(context, rhs) + 42 + end + end + doc.xpath(query, {"ct" => "https://test.nokogiri.org/ct", "date" => "https://test.nokogiri.org/date"}, handler.new) + end + describe "nokogiri-builtin:css-class xpath function" do before do @doc = Nokogiri::HTML::Document.parse("")