public void startElement(String uri, String localname, String qName, Attributes attributes)
      throws SAXException {

    level++;
    final boolean topLevelElement = level == 1;

    if (!gotElements) {
      // Override default as we just go an element

      assert topLevelElement;

      delimiterNamespaceURI = uri;
      delimiterPrefix = XMLUtils.prefixFromQName(qName);
      delimiterLocalName = XMLUtils.localNameFromQName(qName);

      gotElements = true;
    }

    flushCharacters(false, topLevelElement);
    generateFirstDelimitersIfNeeded();

    // Add or update classes on element if needed
    super.startElement(
        uri, localname, qName, topLevelElement ? getAttributesWithClass(attributes) : attributes);
  }
  private void checkDelimiters(String uri, String qName, boolean topLevel) throws SAXException {

    if (topLevel && delimiterNamespaceURI == null) {
      delimiterNamespaceURI = uri;
      delimiterPrefix = XMLUtils.prefixFromQName(qName);
      delimiterLocalName = XMLUtils.localNameFromQName(qName);
    }

    if (mustGenerateFirstDelimiters) {
      // Generate first delimiter
      beginDelimiterListener.generateFirstDelimiter(this);
      mustGenerateFirstDelimiters = false;
    }
  }
  public OutputInterceptor(
      XMLReceiver output,
      String spanQName,
      Listener beginDelimiterListener,
      boolean isAroundTableOrListElement) {
    super(output);
    this.spanQName = spanQName;
    this.beginDelimiterListener = beginDelimiterListener;
    this.isAroundTableOrListElement = isAroundTableOrListElement;

    // Default to <xhtml:span>
    delimiterNamespaceURI = XMLConstants.XHTML_NAMESPACE_URI;
    delimiterPrefix = XMLUtils.prefixFromQName(spanQName);
    delimiterLocalName = XMLUtils.localNameFromQName(spanQName);
  }