LSM6DS0 accelerometer reading with HAL_I2C_Master
You have the wrong understanding of how the LSM6DS0 I2C interface works and you're using the wrong I2C functions from the HAL library.

Please read section 4.1.1 of the LSM6DS0 datasheet.  Pay close attention to tables 16 through 19.  The LSM6DS0 implements multiple registers which are identified by sub-addresses.  In order to read data from a sub-address the master has to write the slave address followed by the register sub-address and then perform a repeated start and read from the slave address.

The HAL_I2C_Master_Transmit() and HAL_I2C_Master_Receive() functions do not support the type of I2C transfer that is required to read data from a sub-address.  HAL_I2C_Master_Receive() does not write a sub-address and does not perform a repeated start.

Instead you should be using HAL_I2C_Mem_Write() and HAL_I2C_Mem_Read().  Try something like this:

#define DEVICE_ADDR 0xD6
#define REG_OUT_X_XL_SUB_ADDR 0x28
#define I2C_TIMEOUT 100

HAL_StatusTypeDef ReadRegister16(uint8_t reg_addr, uint16_t *out_value)
{
    uint16_t reg_value;

    HAL_StatusTypeDef hal_status = HAL_I2C_Mem_Read(&amp;hi2c1, DEVICE_ADDR, reg_addr, I2C_MEMADD_SIZE_8BIT, &amp;reg_value, sizeof(uint16_t), I2C_TIMEOUT);

    if (hal_status == HAL_OK)
    {
        *out_value = reg_val;
    }

    return hal_status;
}