@Override
    public void processingInstruction(final String target, final String data) throws SAXException {
        for (int i = 0; i < filters.length; i++) {
            try {
                final XMLFilter filter = filters[i];
                filter.processingInstruction(target, data);
            } catch (final RuntimeException e1) {
                LOGGER.trace(e1.getMessage(), e1);

                // Make sure the rest of the filters get the event.
                for (i = i + 1; i < filters.length; i++) {
                    final XMLFilter f = filters[i];
                    try {
                        f.processingInstruction(target, data);
                    } catch (final RuntimeException e2) {
                        LOGGER.trace(e2.getMessage(), e2);
                    }
                }

                throw ProcessException.wrap(e1);
            }
        }
    }
Receive notification of a processing instruction.
<p>
<p>
The Parser will invoke this method once for each processing instruction
found: note that processing instructions may occur before or after the
main document element.
</p>
<p>
<p>
A SAX parser must never report an XML declaration (XML 1.0, section 2.8)
or a text declaration (XML 1.0, section 4.3.1) using this method.
</p>
<p>
<p>
Like {@link #characters characters()}, processing instruction data may
have characters that need more than one <code>char</code> value.
</p>

@param target the processing instruction target
@param data   the processing instruction data, or null if none was supplied.
              The data does not include any whitespace separating it from
              the target
@throws org.xml.sax.SAXException any SAX exception, possibly wrapping another exception
stroom-pipeline/src/main/java/stroom/pipeline/filter/XMLFilterFork.java