code: @Override
      public final void endElement(final String ns, final String lName,
              final String qName) throws SAXException {
          // the actual element name is either in lName or qName, depending
          // on whether the parser is namespace aware
          String name = lName == null || lName.length() == 0 ? qName : lName;
  
          // Fire "end" events for all relevant rules in reverse order
          Rule r = (Rule) RULES.match(match);
          if (r != null) {
              r.end(name);
          }
  
          // Recover the previous match expression
          int slash = match.lastIndexOf('/');
          if (slash >= 0) {
              match = match.substring(0, slash);
          } else {
              match = "";
          }
      }
docs: Process notification of the end of an XML element being reached.
  
  @param ns
  - The Namespace URI, or the empty string if the element has no
  Namespace URI or if Namespace processing is not being
  performed.
  @param lName
  - The local name (without prefix), or the empty string if
  Namespace processing is not being performed.
  @param qName
  - The qualified XML 1.0 name (with prefix), or the empty
  string if qualified names are not available.
  
  @exception SAXException
  if a parsing error is to be reported