@Override
  public void visitXmlAttributeValue(final @NotNull XmlAttributeValue value) {
    final PsiElement parent = value.getParent();
    if (parent instanceof XmlAttribute) {
      if (!XsltSupport.isXsltFile(parent.getContainingFile())) {
        return;
      }

      final String s = value.getValue();

      if (s.isEmpty()) {
        if (XsltSupport.isXPathAttribute((XmlAttribute)parent)) {
          InjectedLanguageManager.getInstance(value.getProject()).enumerate(value, (injectedPsi, places) -> {
            if (injectedPsi instanceof XPathFile) {
              if (injectedPsi.getTextLength() == 0) {
                myHolder.newAnnotation(HighlightSeverity.ERROR, XPathBundle.message("annotator.error.empty.xpath.expression")).range(value).create();
              }
            }
          });
        }
      }
      else if (XsltSupport.mayBeAVT((XmlAttribute)parent)) {
        final List<Integer> singleBraces = collectClosingBraceOffsets(s);

        if (singleBraces != null) {
          InjectedLanguageManager.getInstance(value.getProject()).enumerate(value, (injectedPsi, places) -> {
            if (injectedPsi instanceof XPathFile) {
              for (PsiLanguageInjectionHost.Shred place : places) {
                final TextRange range = place.getRangeInsideHost();

                singleBraces.removeIf(range::contains);
              }
            }
          });

          final String message = XPathBundle.message("annotator.error.invalid.single.closing.brace.escape.as.double.closing.brace");
          for (Integer brace : singleBraces) {
            myHolder.newAnnotation(HighlightSeverity.ERROR, message).range(TextRange.from(value.getTextOffset() + brace, 1)).create();
          }
        }
      }
    }
    super.visitXmlAttributeValue(value);
  }
@Override
  public void visitXmlAttributeValue(final @NotNull XmlAttributeValue value)