docs: private void parseAttribute(final Attributes atts, final String attrName) throws SAXException {
          URI attrValue = toURI(atts.getValue(attrName));
          if (attrValue == null) {
              return;
          }
  
          //Check if this attribute will be ignored due to conref
          final String attrConref = atts.getValue(ATTRIBUTE_NAME_CONREF);
          if (attrConref != null && !attrConref.isEmpty() && ATTR_VALUE_DITA_USE_CONREF_TARGET.equals(attrValue.toString())) {
              return;
          }
  
          final String attrClass = atts.getValue(ATTRIBUTE_NAME_CLASS);
          final String attrScope = atts.getValue(ATTRIBUTE_NAME_SCOPE);
  
          // external resource is filtered here.
          if (ATTR_SCOPE_VALUE_EXTERNAL.equals(attrScope) || ATTR_SCOPE_VALUE_PEER.equals(attrScope)
                  || attrValue.toString().startsWith(SHARP)) {
              return;
          }
  
          final URI filename = stripFragment(attrValue.isAbsolute() ? attrValue : currentDir.resolve(attrValue));
          assert filename.isAbsolute();
  
          final String attrType = atts.getValue(ATTRIBUTE_NAME_TYPE);
          if (MAP_TOPICREF.matches(attrClass) && ATTR_TYPE_VALUE_SUBJECT_SCHEME.equalsIgnoreCase(attrType)) {
              schemeSet.add(filename);
          }
  
          final String attrFormat = getFormat(atts);
  
          if (ATTRIBUTE_NAME_HREF.equals(attrName)) {
              hasHref = true;
              // Collect non-conref and non-copyto targets
              if (isFormatDita(attrFormat) && !isDitaMap() &&
                      !job.crawlTopics()) {
                  // DITA link in a topic, but not crawling topics
              } else if ((followLinks() && canFollow(attrValue))
                      || TOPIC_IMAGE.matches(attrClass)
                      || SVG_D_SVGREF.matches(attrClass)
                      || DITAVAREF_D_DITAVALREF.matches(attrClass)) {
                  nonConrefCopytoTargets.add(new Reference(filename, attrFormat));
              }
          }
  
          if (isFormatDita(attrFormat)) { // && formatFilter.test(attrFormat)
              if (ATTRIBUTE_NAME_HREF.equals(attrName) && canFollow(attrValue)) {
                  if (followLinks()) {
                      hrefTargets.add(filename);
                      toOutFile(filename, atts);
                  }
              } else if (ATTRIBUTE_NAME_COPY_TO.equals(attrName)) {
                  final URI copyTo = toURI(atts.getValue(ATTRIBUTE_NAME_HREF));
                  if (copyTo != null) {
                      if (copyTo.toString().isEmpty()) {
                          logger.warn("Copy-to task [href=\"\" copy-to=\"" + filename + "\"] was ignored.");
                      } else {
                          final URI value = stripFragment(currentDir.resolve(copyTo));
                          if (copytoMap.get(filename) != null) {
                              if (!value.equals(copytoMap.get(filename))) {
                                  logger.warn(MessageUtils.getMessage("DOTX065W", copyTo.toString(), filename.toString())
                                          .setLocation(atts).toString());
                              }
                              ignoredCopytoSourceSet.add(value);
                          } else {
                              copytoMap.put(filename, value);
                          }
                      }
                  }
              }
          }
      }