docs: private void processFile(final ResolveTask r) {
          final List<XMLFilter> filters = new ArrayList<>();
  
          final ConkeyrefFilter conkeyrefFilter = new ConkeyrefFilter();
          conkeyrefFilter.setLogger(logger);
          conkeyrefFilter.setJob(job);
          conkeyrefFilter.setKeyDefinitions(r.scope);
          conkeyrefFilter.setCurrentFile(job.tempDirURI.resolve(r.in.uri));
          conkeyrefFilter.setDelayConrefUtils(delayConrefUtils);
          filters.add(conkeyrefFilter);
  
          filters.add(topicFragmentFilter);
  
          final KeyrefPaser parser = new KeyrefPaser();
          parser.setLogger(logger);
          parser.setJob(job);
          parser.setKeyDefinition(r.scope);
          parser.setCurrentFile(job.tempDirURI.resolve(r.in.uri));
          filters.add(parser);
  
          try {
              logger.debug("Using " + (r.scope.name != null ? r.scope.name + " scope" : "root scope"));
              if (r.out != null) {
                  logger.info("Processing " + job.tempDirURI.resolve(r.in.uri) +
                          " to " + job.tempDirURI.resolve(r.out.uri));
                  xmlUtils.transform(new File(job.tempDir, r.in.file.getPath()),
                                     new File(job.tempDir, r.out.file.getPath()),
                                     filters);
              } else {
                  logger.info("Processing " + job.tempDirURI.resolve(r.in.uri));
                  xmlUtils.transform(new File(job.tempDir, r.in.file.getPath()), filters);
              }
              // validate resource-only list
              normalProcessingRole.addAll(parser.getNormalProcessingRoleTargets());
          } catch (final DITAOTException e) {
              logger.error("Failed to process key references: " + e.getMessage(), e);
          }
      }