Пример #1
0
 def xpath_nth_child_function(self, xpath, function, last=False,
                              add_name_test=True):
     try:
         a, b = parse_series(function.arguments)
     except ValueError:
         raise ExpressionError("Invalid series: '%r'" % function.arguments)
     if add_name_test:
         xpath.add_name_test()
     xpath.add_star_prefix()
     if a == 0:
         if last:
             b = 'last() - %s' % b
         return xpath.add_condition('position() = %s' % b)
     if last:
         # FIXME: I'm not sure if this is right
         a = -a
         b = -b
     if b > 0:
         b_neg = str(-b)
     else:
         b_neg = '+%s' % (-b)
     if a != 1:
         expr = ['(position() %s) mod %s = 0' % (b_neg, a)]
     else:
         expr = []
     if b >= 0:
         expr.append('position() >= %s' % b)
     elif b < 0 and last:
         expr.append('position() < (last() %s)' % b)
     expr = ' and '.join(expr)
     if expr:
         xpath.add_condition(expr)
     return xpath