diff --git a/CHANGELOG.rst b/CHANGELOG.rst
index 8f1912c..b752e3d 100644
--- a/CHANGELOG.rst
+++ b/CHANGELOG.rst
@@ -12,6 +12,8 @@ Unreleased
 
 - Update vendored schemas (2022-10-20)
 - Tweak format checker usage to avoid deprecation warning from ``jsonschema``
+- The Azure Pipelines data transform is now more permissive, which should allow
+  it to handle a wider variety of pipelines files (:issue:`162`)
 
 0.18.3
 ------
diff --git a/src/check_jsonschema/transforms/azure_pipelines.py b/src/check_jsonschema/transforms/azure_pipelines.py
index bdfd107..516ae6c 100644
--- a/src/check_jsonschema/transforms/azure_pipelines.py
+++ b/src/check_jsonschema/transforms/azure_pipelines.py
@@ -85,19 +85,39 @@ def traverse_dict(data: dict) -> dict:
         if is_expression(key):
             # WARNING -- correctness unclear
             #
-            # in the case that an expression in a dict does not map to a dict, the
-            # azure-pipelines-language server will drop it from the data:
-            # https://github.com/microsoft/azure-pipelines-language-server/blob/71b20f92874c02dfe82ad2cc2dcc7fa64996be91/language-service/src/parser/yamlParser.ts#L185
+            # "lift" any dict by moving its attributes up into the object being evaluated
+            #
+            # e.g.
+            #    parent:
+            #      ${{ each x in xs }}:
+            #        - k: v-${{ x }}
+            #
+            # becomes
             #
-            # instead, we'll raise an error
+            #    parent:
+            #      - k: v-${{ x }}
             if isinstance(newvalue, dict):
                 for add_k, add_v in newvalue.items():
                     newdata[add_k] = add_v
+            # In all other cases, drop the content from the data. This is based on the
+            # azure-pipelines-language server behavior:
+            # https://github.com/microsoft/azure-pipelines-language-server/blob/71b20f92874c02dfe82ad2cc2dcc7fa64996be91/language-service/src/parser/yamlParser.ts#L185
+            #
+            # earlier versions would raise an error here, but this caused issues with
+            # data in which expressions were mapped to simple strings
+            #
+            # e.g.
+            #
+            #    parent:
+            #      ${{ x }}: ${{ y }}
+            #
+            # which occurs naturally *after* a lifting operation, as in
+            #
+            #    parent:
+            #      ${{ each x, y in attrs }}:
+            #        ${{ x }}: ${{ y }}
             else:
-                raise AzurePipelinesDataError(
-                    "found non-object data under an expression in an object, "
-                    f"expression={key}"
-                )
+                continue
         else:
             newdata[key] = newvalue
     return newdata

diff --git a/tests/example-files/hooks/positive/azure-pipelines/object-defined-by-expression-map.yaml b/tests/example-files/hooks/positive/azure-pipelines/object-defined-by-expression-map.yaml
new file mode 100644
index 0000000..b789a27
--- /dev/null
+++ b/tests/example-files/hooks/positive/azure-pipelines/object-defined-by-expression-map.yaml
@@ -0,0 +1,15 @@
+parameters:
+  - name: env
+    default:
+      - key: FOO
+        value: foo
+      - key: BAR
+        value: bar
+
+jobs:
+  - job: echo-foo-bar
+    steps:
+      - bash: 'echo "$FOO-$BAR"'
+        env:
+          ${{ each pair in parameters.env }}:
+            ${{ pair.key }}: ${{ pair.value }}

AzurePipelinesDataError on valid expression syntax
Looking to validate my Azure pipelines and have run into a blocker.  I currently have a pipeline in production ( working and running ) with the following syntax

     steps:
          - bash: |         
              pipenv run pip install ansible-lint-junit --upgrade
              pipenv run ansible-lint -c ../.config/ansible-lint.yml -p --nocolor > ansible-lint.txt
              pipenv run ansible-lint-junit ansible-lint.txt -o AnsibleLintReport.xml
            displayName: "Lint"
            workingDirectory: ${{parameters.workdir}}
            env:
              ${{ each pair in parameters.env }}:
                ${{ pair.key }}: ${{ pair.value }}

when running with the pre-commit hook

            - repo: https://github.com/python-jsonschema/check-jsonschema
              rev: 0.18.3
              hooks:
                - id: check-azure-pipelines
                  files: '^.azure/.*\.yml'
it currently raises the error 

      raise AzurePipelinesDataError(
      check_jsonschema.transforms.azure_pipelines.AzurePipelinesDataError: azure-pipelines transform: found non-object data under an expression in an object, expression=${{ pair.key }}

tests/acceptance/test_example_files.py::test_hook_positive_examples[positive/azure-pipelines/object-defined-by-expression-map.yaml]
tests/acceptance/test_example_files.py::test_hook_positive_examples[positive/metaschema/almost_empty.yaml] tests/acceptance/test_example_files.py::test_hook_positive_examples[positive/metaschema/draft3.json] tests/acceptance/test_example_files.py::test_hook_positive_examples[positive/metaschema/draft7.json] tests/acceptance/test_example_files.py::test_hook_positive_examples[positive/azure-pipelines/expression-from-lang-server.yaml] tests/acceptance/test_example_files.py::test_hook_positive_examples[positive/azure-pipelines/expression-transform.yaml] tests/acceptance/test_example_files.py::test_hook_positive_examples[positive/azure-pipelines/marshmallow.yaml] tests/acceptance/test_example_files.py::test_hook_positive_examples[positive/github-actions/redis-simple.yml] tests/acceptance/test_example_files.py::test_hook_positive_examples[positive/github-workflows/self-build.yaml] tests/acceptance/test_example_files.py::test_hook_positive_examples[positive/github-workflows/has-unicode.yaml] tests/acceptance/test_example_files.py::test_hook_positive_examples[positive/gitlab-ci/reference-tag.yaml] tests/acceptance/test_example_files.py::test_hook_positive_examples[positive/readthedocs/simple.yaml] tests/acceptance/test_example_files.py::test_hook_positive_examples[positive/renovate/starter-config.json] tests/acceptance/test_example_files.py::test_hook_positive_examples[positive/travis/python-build.yaml] tests/acceptance/test_example_files.py::test_hook_negative_examples[negative/metaschema/draft7_title_array.json] tests/acceptance/test_example_files.py::test_hook_negative_examples[negative/metaschema/draft7_title_array.yaml] tests/acceptance/test_example_files.py::test_hook_negative_examples[negative/github-workflows/empty.json] tests/acceptance/test_example_files.py::test_hook_negative_examples[negative/readthedocs/pyversion-float.yml] tests/acceptance/test_example_files.py::test_explicit_positive_examples[complex-yaml] tests/acceptance/test_example_files.py::test_explicit_positive_examples[simple-toml] tests/acceptance/test_example_files.py::test_explicit_positive_examples[integer-keys-yaml] tests/acceptance/test_example_files.py::test_explicit_positive_examples[complex-toml] tests/acceptance/test_format_failure.py::test_format_check_passing tests/acceptance/test_format_failure.py::test_format_failure_exit_error tests/acceptance/test_format_failure.py::test_format_failure_ignore tests/acceptance/test_format_failure.py::test_format_failure_ignore_multidoc tests/acceptance/test_format_regex_opts.py::test_regex_format_good[disabled] tests/acceptance/test_format_regex_opts.py::test_regex_format_good[default] tests/acceptance/test_format_regex_opts.py::test_regex_format_good[python] tests/acceptance/test_format_regex_opts.py::test_regex_format_accepts_non_str_inputs[disabled] tests/acceptance/test_format_regex_opts.py::test_regex_format_accepts_non_str_inputs[default] tests/acceptance/test_format_regex_opts.py::test_regex_format_accepts_non_str_inputs[python] tests/acceptance/test_format_regex_opts.py::test_regex_format_bad[disabled] tests/acceptance/test_format_regex_opts.py::test_regex_format_bad[default] tests/acceptance/test_format_regex_opts.py::test_regex_format_bad[python] tests/acceptance/test_format_regex_opts.py::test_regex_format_js_specific[disabled] tests/acceptance/test_format_regex_opts.py::test_regex_format_js_specific[default] tests/acceptance/test_format_regex_opts.py::test_regex_format_js_specific[python] tests/acceptance/test_format_regex_opts.py::test_regex_format_in_renovate_config tests/acceptance/test_gitlab_reference_handling.py::test_gitlab_reference_handling_on_bad_data tests/acceptance/test_invalid_schema_files.py::test_checker_non_json_schemafile tests/acceptance/test_invalid_schema_files.py::test_checker_invalid_schemafile tests/acceptance/test_invalid_schema_files.py::test_checker_invalid_schemafile_scheme tests/acceptance/test_local_relative_ref.py::test_local_ref_schema[True-main_schema0-other_schema_data0-instance0] tests/acceptance/test_local_relative_ref.py::test_local_ref_schema[True-main_schema1-other_schema_data1-instance1] tests/acceptance/test_local_relative_ref.py::test_local_ref_schema[False-main_schema0-other_schema_data0-instance0] tests/acceptance/test_local_relative_ref.py::test_local_ref_schema[False-main_schema1-other_schema_data1-instance1] tests/acceptance/test_local_relative_ref.py::test_local_ref_schema_failure_case[True-main_schema0-other_schema_data0-instance0-None] tests/acceptance/test_local_relative_ref.py::test_local_ref_schema_failure_case[True-main_schema1-other_schema_data1-instance1-{'foo': tests/acceptance/test_local_relative_ref.py::test_local_ref_schema_failure_case[False-main_schema0-other_schema_data0-instance0-None] tests/acceptance/test_local_relative_ref.py::test_local_ref_schema_failure_case[False-main_schema1-other_schema_data1-instance1-{'foo': tests/acceptance/test_malformed_instances.py::test_non_json_instance tests/acceptance/test_malformed_instances.py::test_non_json_instance_mixed_with_valid_data[TEXT] tests/acceptance/test_malformed_instances.py::test_non_json_instance_mixed_with_valid_data[JSON] tests/acceptance/test_malformed_instances.py::test_non_json_instance_mixed_with_valid_and_invalid_data[TEXT] tests/acceptance/test_malformed_instances.py::test_non_json_instance_mixed_with_valid_and_invalid_data[JSON] tests/acceptance/test_nonjson_schema_handling.py::test_warning_on_yaml_reference_passes[True] tests/acceptance/test_nonjson_schema_handling.py::test_warning_on_yaml_reference_passes[False] tests/acceptance/test_nonjson_schema_handling.py::test_warning_on_json5_reference[True] tests/acceptance/test_nonjson_schema_handling.py::test_warning_on_json5_reference[False] tests/acceptance/custom_schemas/test_github_workflow_require_explicit_timeout.py::test_github_require_timeouts_passing[github-workflows-github-workflows-require-timeout] tests/acceptance/custom_schemas/test_github_workflow_require_explicit_timeout.py::test_github_require_timeouts_passing[github-workflows-custom.github-workflows-require-timeout] tests/acceptance/custom_schemas/test_github_workflow_require_explicit_timeout.py::test_github_require_timeouts_passing[vendor.github-workflows-github-workflows-require-timeout] tests/acceptance/custom_schemas/test_github_workflow_require_explicit_timeout.py::test_github_require_timeouts_passing[vendor.github-workflows-custom.github-workflows-require-timeout] tests/acceptance/custom_schemas/test_github_workflow_require_explicit_timeout.py::test_github_require_timeouts_failing[github-workflows-github-workflows-require-timeout] tests/acceptance/custom_schemas/test_github_workflow_require_explicit_timeout.py::test_github_require_timeouts_failing[github-workflows-custom.github-workflows-require-timeout] tests/acceptance/custom_schemas/test_github_workflow_require_explicit_timeout.py::test_github_require_timeouts_failing[vendor.github-workflows-github-workflows-require-timeout] tests/acceptance/custom_schemas/test_github_workflow_require_explicit_timeout.py::test_github_require_timeouts_failing[vendor.github-workflows-custom.github-workflows-require-timeout] tests/unit/test_cachedownloader.py::test_default_filename_from_uri tests/unit/test_cachedownloader.py::test_default_cache_dir[Windows-fakeenv0-None] tests/unit/test_cachedownloader.py::test_default_cache_dir[Windows-fakeenv1-localappdata] tests/unit/test_cachedownloader.py::test_default_cache_dir[Windows-fakeenv2-localappdata] tests/unit/test_cachedownloader.py::test_default_cache_dir[Windows-fakeenv3-appdata] tests/unit/test_cachedownloader.py::test_default_cache_dir[Darwin-fakeenv4-<expanduser>] tests/unit/test_cachedownloader.py::test_default_cache_dir[Linux-fakeenv5-<expanduser>] tests/unit/test_cachedownloader.py::test_default_cache_dir[Linux-fakeenv6-xdg-cache] tests/unit/test_cachedownloader.py::test_cache_hit_by_mtime tests/unit/test_cachedownloader.py::test_cachedownloader_cached_file tests/unit/test_cachedownloader.py::test_cachedownloader_e2e[0-filename] tests/unit/test_cachedownloader.py::test_cachedownloader_e2e[0-filename_otherdir] tests/unit/test_cachedownloader.py::test_cachedownloader_e2e[0-cache_dir] tests/unit/test_cachedownloader.py::test_cachedownloader_e2e[0-disable_cache] tests/unit/test_cachedownloader.py::test_cachedownloader_e2e[1-filename] tests/unit/test_cachedownloader.py::test_cachedownloader_e2e[1-filename_otherdir] tests/unit/test_cachedownloader.py::test_cachedownloader_e2e[1-cache_dir] tests/unit/test_cachedownloader.py::test_cachedownloader_e2e[1-disable_cache] tests/unit/test_cachedownloader.py::test_cachedownloader_e2e[10-filename] tests/unit/test_cachedownloader.py::test_cachedownloader_e2e[10-filename_otherdir] tests/unit/test_cachedownloader.py::test_cachedownloader_e2e[10-cache_dir] tests/unit/test_cachedownloader.py::test_cachedownloader_e2e[10-disable_cache] tests/unit/test_cachedownloader.py::test_cachedownloader_e2e[ConnectionError-filename] tests/unit/test_cachedownloader.py::test_cachedownloader_e2e[ConnectionError-filename_otherdir] tests/unit/test_cachedownloader.py::test_cachedownloader_e2e[ConnectionError-cache_dir] tests/unit/test_cachedownloader.py::test_cachedownloader_e2e[ConnectionError-disable_cache] tests/unit/test_catalog.py::test_schema_catalog_is_alphabetized tests/unit/test_catalog.py::test_hooks_cover_catalog tests/unit/test_cli_parse.py::test_parse_result_set_schema[foo.json-None-False-SchemaLoadingMode.filepath] tests/unit/test_cli_parse.py::test_parse_result_set_schema[None-foo-False-SchemaLoadingMode.builtin] tests/unit/test_cli_parse.py::test_parse_result_set_schema[None-None-True-SchemaLoadingMode.metaschema] tests/unit/test_cli_parse.py::test_requires_some_args tests/unit/test_cli_parse.py::test_schemafile_and_instancefile tests/unit/test_cli_parse.py::test_requires_at_least_one_instancefile tests/unit/test_cli_parse.py::test_requires_schemafile tests/unit/test_cli_parse.py::test_no_cache_defaults_false tests/unit/test_cli_parse.py::test_no_cache_flag_is_true tests/unit/test_cli_parse.py::test_mutex_schema_opts[cmd_args0] tests/unit/test_cli_parse.py::test_mutex_schema_opts[cmd_args1] tests/unit/test_cli_parse.py::test_mutex_schema_opts[cmd_args2] tests/unit/test_cli_parse.py::test_mutex_schema_opts[cmd_args3] tests/unit/test_cli_parse.py::test_supports_common_option[cmd_args0] tests/unit/test_cli_parse.py::test_supports_common_option[cmd_args1] tests/unit/test_cli_parse.py::test_supports_common_option[cmd_args2] tests/unit/test_cli_parse.py::test_no_color_env_var[None-None] tests/unit/test_cli_parse.py::test_no_color_env_var[1-False] tests/unit/test_cli_parse.py::test_no_color_env_var[0-False] tests/unit/test_gitlab_data_transform.py::test_can_parse_yaml_with_transform tests/unit/test_gitlab_data_transform.py::test_can_parse_ok_gitlab_yaml_with_transform tests/unit/test_gitlab_data_transform.py::test_cannot_parse_bad_gitlab_yaml_with_transform tests/unit/test_instance_loader.py::test_instanceloader_json_data[foo.json-None] tests/unit/test_instance_loader.py::test_instanceloader_json_data[foo.json-json] tests/unit/test_instance_loader.py::test_instanceloader_json_data[foo.json-yaml] tests/unit/test_instance_loader.py::test_instanceloader_json_data[foo-json] tests/unit/test_instance_loader.py::test_instanceloader_json_data[foo-yaml] tests/unit/test_instance_loader.py::test_instanceloader_yaml_data[foo.yaml-None] tests/unit/test_instance_loader.py::test_instanceloader_yaml_data[foo.yml-None] tests/unit/test_instance_loader.py::test_instanceloader_yaml_data[foo.yaml-json] tests/unit/test_instance_loader.py::test_instanceloader_yaml_data[foo.yml-json] tests/unit/test_instance_loader.py::test_instanceloader_yaml_data[foo.yaml-yaml] tests/unit/test_instance_loader.py::test_instanceloader_yaml_data[foo.yml-yaml] tests/unit/test_instance_loader.py::test_instanceloader_yaml_data[foo-yaml] tests/unit/test_instance_loader.py::test_instanceloader_unknown_type tests/unit/test_instance_loader.py::test_instanceloader_optional_format_handling[False-json5-{}-expect_data0-pip tests/unit/test_instance_loader.py::test_instanceloader_optional_format_handling[True-toml-[foo]\nbar tests/unit/test_instance_loader.py::test_instanceloader_yaml_dup_anchor tests/unit/test_instance_loader.py::test_instanceloader_invalid_data[json-foo.json-{"a":\n] tests/unit/test_instance_loader.py::test_instanceloader_invalid_data[yaml-foo.yaml-a: tests/unit/test_instance_loader.py::test_instanceloader_invalid_data[toml-foo.toml-abc\n] tests/unit/test_instance_loader.py::test_instanceloader_invalid_data_mixed_with_valid_data tests/unit/test_reporters.py::test_text_format_success[False-0] tests/unit/test_reporters.py::test_text_format_success[False-1] tests/unit/test_reporters.py::test_text_format_success[False-2] tests/unit/test_reporters.py::test_text_format_success[True-0] tests/unit/test_reporters.py::test_text_format_success[True-1] tests/unit/test_reporters.py::test_text_format_success[True-2] tests/unit/test_reporters.py::test_json_format_success[False-0] tests/unit/test_reporters.py::test_json_format_success[False-1] tests/unit/test_reporters.py::test_json_format_success[True-0] tests/unit/test_reporters.py::test_json_format_success[True-1] tests/unit/test_reporters.py::test_text_format_validation_error_message_simple tests/unit/test_reporters.py::test_text_print_validation_error_nested[0] tests/unit/test_reporters.py::test_text_print_validation_error_nested[1] tests/unit/test_reporters.py::test_text_print_validation_error_nested[2] tests/unit/test_reporters.py::test_json_format_validation_error_nested[0-True] tests/unit/test_reporters.py::test_json_format_validation_error_nested[0-False] tests/unit/test_reporters.py::test_json_format_validation_error_nested[1-True] tests/unit/test_reporters.py::test_json_format_validation_error_nested[1-False] tests/unit/test_reporters.py::test_json_format_validation_error_nested[2-True] tests/unit/test_reporters.py::test_json_format_validation_error_nested[2-False] tests/unit/test_schema_loader.py::test_schemaloader_path_handling_relative_local_path[schema.json] tests/unit/test_schema_loader.py::test_schemaloader_path_handling_relative_local_path[schema.yaml] tests/unit/test_schema_loader.py::test_schemaloader_local_yaml_data[schema.yaml] tests/unit/test_schema_loader.py::test_schemaloader_local_yaml_data[schema.yml] tests/unit/test_schema_loader.py::test_schemaloader_remote_path[https://foo.example.com/schema.json] tests/unit/test_schema_loader.py::test_schemaloader_remote_path[http://foo.example.com/schema.json] tests/unit/test_schema_loader.py::test_schemaloader_local_yaml_dup_anchor tests/unit/test_schema_loader.py::test_schemaloader_invalid_yaml_data