@Override
  @NotNull
  public DataIndexer<String, Kind, FileContent> getIndexer() {
    return new DataIndexer<>() {
      @Override
      @NotNull
      public Map<String, Kind> map(@NotNull FileContent inputData) {
        CharSequence inputDataContentAsText = inputData.getContentAsText();
        if (CharArrayUtil.indexOf(inputDataContentAsText, XsltSupport.XSLT_NS, 0) == -1) {
          return Collections.emptyMap();
        }
        final Map<String, Kind> map = new HashMap<>();
        NanoXmlUtil.parse(CharArrayUtil.readerFromCharSequence(inputData.getContentAsText()), new NanoXmlBuilder() {
          NanoXmlBuilder attributeHandler;
          int depth;

          @Override
          public void addAttribute(String key, String nsPrefix, String nsURI, String value, String type) throws Exception {
            if (attributeHandler != null) {
              attributeHandler.addAttribute(key, nsPrefix, nsURI, value, type);
            }
          }

          @Override
          public void startElement(String name, String nsPrefix, String nsURI, String systemID, int lineNr) {
            attributeHandler = null;
            if (depth == 1 && XsltSupport.XSLT_NS.equals(nsURI)) {
              if ("template".equals(name)) {
                attributeHandler = new MyAttributeHandler(map, Kind.TEMPLATE);
              }
              else if ("variable".equals(name)) {
                attributeHandler = new MyAttributeHandler(map, Kind.VARIABLE);
              }
              else if ("param".equals(name)) {
                attributeHandler = new MyAttributeHandler(map, Kind.PARAM);
              }
            }
            depth++;
          }

          @Override
          public void endElement(String name, String nsPrefix, String nsURI) {
            attributeHandler = null;
            depth--;
          }
        });
        return map;
      }
    };
  }
@Override
  @NotNull
  public DataIndexer<String, Kind, FileContent> getIndexer()