@Override
    public void startElement(final String uri, final String localName, final String qName, final Attributes atts)
            throws SAXException {
        try {
            // When we are stepping each XML output record will begin at line 1
            // again.
            if (pipelineContext.isStepping() && depth == 0) {
                lineNo = 1;
                schemaLocations = null;
            }

            colNo = depth * INDENT;
            lineNo++;
            inStartElement = true;

            depth++;

            storeSchemaLocations(uri, atts);

            if (validator != null) {
                validator.startElement(uri, localName, qName, atts);
            }
        } catch (final RuntimeException e) {
            unexpectedError("startElement()", e);
        } finally {
            super.startElement(uri, localName, qName, atts);
        }
    }
This method is entered for every start element. If this is the first
start element in a document it looks for a schema declaration to use to
validate the rest of the document.

@param uri       The element's namespace URI, or the empty string.
@param localName The element's local name, or the empty string.
@param qName     The element's qualified (prefixed) name, or the empty string.
@param atts      The element's attributes.
@throws org.xml.sax.SAXException The client may throw an exception during processing.
@see stroom.pipeline.filter.AbstractXMLFilter#startElement(java.lang.String,
java.lang.String, java.lang.String, org.xml.sax.Attributes)
stroom-pipeline/src/main/java/stroom/pipeline/filter/SchemaFilter.java