docs: protected void parseHeaderElements(Element actionElement, AbstractMessageContentBuilder messageBuilder, List<ValidationContext> validationContexts) {
          Element headerElement = DomUtils.getChildElementByTagName(actionElement, "header");
          Map<String, Object> messageHeaders = new LinkedHashMap<>();
  
          if (headerElement != null) {
              List<?> elements = DomUtils.getChildElementsByTagName(headerElement, "element");
              for (Iterator<?> iter = elements.iterator(); iter.hasNext();) {
                  Element headerValue = (Element) iter.next();
                  
                  String name = headerValue.getAttribute("name");
                  String value = headerValue.getAttribute("value");
                  String type = headerValue.getAttribute("type");
  
                  if (StringUtils.hasText(type)) {
                      value = MessageHeaderType.createTypedValue(type, value);
                  }
                  
                  messageHeaders.put(name, value);
              }
              
              List<Element> headerDataElements = DomUtils.getChildElementsByTagName(headerElement, "data");
              for (Element headerDataElement : headerDataElements) {
                  messageBuilder.getHeaderData().add(DomUtils.getTextValue(headerDataElement).trim());
              }
  
              List<Element> headerResourceElements = DomUtils.getChildElementsByTagName(headerElement, "resource");
              for (Element headerResourceElement : headerResourceElements) {
                  String charset = headerResourceElement.getAttribute("charset");
                  messageBuilder.getHeaderResources().add(headerResourceElement.getAttribute("file") + (StringUtils.hasText(charset) ? FileUtils.FILE_PATH_CHARSET_PARAMETER + charset : ""));
              }
  
              // parse fragment with xs-any element
              List<Element> headerFragmentElements = DomUtils.getChildElementsByTagName(headerElement, "fragment");
              for (Element headerFragmentElement : headerFragmentElements) {
                  List<Element> fragment = DomUtils.getChildElements(headerFragmentElement);
                  if (!CollectionUtils.isEmpty(fragment)) {
                      messageBuilder.getHeaderData().add(PayloadElementParser.parseMessagePayload(fragment.get(0)));
                  }
              }
  
              messageBuilder.setMessageHeaders(messageHeaders);
  
              if (headerElement.hasAttribute("ignore-case")) {
                  boolean ignoreCase = Boolean.valueOf(headerElement.getAttribute("ignore-case"));
                  validationContexts.stream().filter(context -> context instanceof HeaderValidationContext)
                                              .map(context -> (HeaderValidationContext) context)
                                              .forEach(context -> context.setHeaderNameIgnoreCase(ignoreCase));
              }
          }
      }