blob: 3da55d72297dcd26b9938a1834631dd1896f8e19 [file] [log] [blame]
/*
* The Apache Software License, Version 1.1
*
*
* Copyright (c) 1999 The Apache Software Foundation. All rights
* reserved.
*
* Redistribution and use in source and binary forms, with or without
* modification, are permitted provided that the following conditions
* are met:
*
* 1. Redistributions of source code must retain the above copyright
* notice, this list of conditions and the following disclaimer.
*
* 2. Redistributions in binary form must reproduce the above copyright
* notice, this list of conditions and the following disclaimer in
* the documentation and/or other materials provided with the
* distribution.
*
* 3. The end-user documentation included with the redistribution,
* if any, must include the following acknowledgment:
* "This product includes software developed by the
* Apache Software Foundation (http://www.apache.org/)."
* Alternately, this acknowledgment may appear in the software itself,
* if and wherever such third-party acknowledgments normally appear.
*
* 4. The names "Xalan" and "Apache Software Foundation" must
* not be used to endorse or promote products derived from this
* software without prior written permission. For written
* permission, please contact apache@apache.org.
*
* 5. Products derived from this software may not be called "Apache",
* nor may "Apache" appear in their name, without prior written
* permission of the Apache Software Foundation.
*
* THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESSED OR IMPLIED
* WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
* OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
* DISCLAIMED. IN NO EVENT SHALL THE APACHE SOFTWARE FOUNDATION OR
* ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
* SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
* LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF
* USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
* ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
* OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT
* OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
* SUCH DAMAGE.
* ====================================================================
*
* This software consists of voluntary contributions made by many
* individuals on behalf of the Apache Software Foundation and was
* originally based on software copyright (c) 1999, International
* Business Machines, Inc., http://www.ibm.com. For more
* information on the Apache Software Foundation, please see
* <http://www.apache.org/>.
*
* $ Id: $
*
*/
#if !defined(XALAN_XSLTPROCESSOR_HEADER_GUARD)
#define XALAN_XSLTPROCESSOR_HEADER_GUARD
// Base include file. Must be first.
#include "XSLTDefinitions.hpp"
#include <cstddef>
#include <XalanDOM/XalanDOMString.hpp>
class ElemTemplateElement;
class FormatterListener;
class GenerateEvent;
class Locator;
class NodeRefListBase;
class PrefixResolver;
class PrintWriter;
class ResultTreeFragBase;
class SelectionEvent;
class StylesheetConstructionContext;
class StylesheetExecutionContext;
class StylesheetRoot;
class TraceListener;
class TracerEvent;
class XalanDocument;
class XalanElement;
class XalanNode;
class XMLParserLiaison;
class XObject;
class XObjectPtr;
class XPathExecutionContext;
class XSLTInputSource;
class XSLTResultTarget;
/**
* This is an interface for an XSLT Processor engine. It's the responsibility
* of the implementation of the XSLTProcessor interface, collaborating with a
* XMLParserLiaison, the DOM, and the XPath engine, to transform a source tree
* of nodes into a result tree according to instructions and templates
* specified by a stylesheet tree. The methods process(...) are
* the primary public entry points.
*
* If you reuse the processor instance, you should call reset() between calls.
*/
class XALAN_XSLT_EXPORT XSLTProcessor
{
public:
typedef size_t size_type;
XSLTProcessor();
virtual
~XSLTProcessor();
/**
* Transform the source tree to the output in the given result tree target.
* The processor will process the input source, the stylesheet source,
* and transform to the output target.
*
* @param inputSource input source
* @param stylesheetSource stylesheet source
* @param outputTarget output source tree
* @param constructionContext context for construction of objects
* @param executionContext current execution context
* @exception XSLProcessorException
*/
virtual void
process(
const XSLTInputSource& inputSource,
const XSLTInputSource& stylesheetSource,
XSLTResultTarget& outputTarget,
StylesheetConstructionContext& constructionContext,
StylesheetExecutionContext& executionContext) = 0;
/**
* Transform the source tree to the output in the given result tree target.
* This function does not create a stylesheet tree, it assumes the
* provided StylesheetExecutionContext has the stylesheet tree to use. This
* is set by calling StylesheetExecutionContext::setStylesheetRoot().
*
* @param inputSource input source
* @param outputTarget output source tree
* @param executionContext current execution context
* @exception XSLProcessorException
*/
virtual void
process(
const XSLTInputSource& inputSource,
XSLTResultTarget& outputTarget,
StylesheetExecutionContext& executionContext) = 0;
/**
* Given a stylesheet input source, compile the stylesheet into an internal
* representation.
*
* @param stylesheetSource input source for the stylesheet
* @param constructionContext context for construction of objects
* @return pointer to the compiled stylesheet object
* @exception XSLProcessorException
*/
virtual StylesheetRoot*
processStylesheet(
const XSLTInputSource& stylesheetSource,
StylesheetConstructionContext& constructionContext) = 0;
/**
* Given a URI to an XSL stylesheet, compile the stylesheet into an internal
* representation.
*
* @param xmldocURLString URI to the input XML document
* @param constructionContext context for construction of objects
* @return pointer to compiled stylesheet object
* @exception XSLProcessorException
*/
virtual StylesheetRoot*
processStylesheet(
const XalanDOMString& xsldocURLString,
StylesheetConstructionContext& constructionContext) = 0;
/**
* Reset the state. This needs to be called after a process() call
* is invoked, if the processor is to be used again.
*/
virtual void
reset() = 0;
/**
* Get a factory for creating new target nodes.
*
* @return The factory
*/
virtual XalanDocument*
getDOMFactory() const = 0;
/**
* Given an input source, get the source tree.
*
* @param inputSource pointer to input source
* @return source tree
*/
virtual XalanNode*
getSourceTreeFromInput(const XSLTInputSource& inputSource) = 0;
/**
* Output an object to the result tree by doing the right conversions.
*
* @param obj the XObject to output
*/
virtual void
outputToResultTree(const XObject& xobj) = 0;
/**
* Retrieve the root stylesheet.
*
* @return pointer to root stylesheet
*/
virtual const StylesheetRoot*
getStylesheetRoot() const = 0;
/**
* Set the root stylesheet.
*
* @param theStylesheet pointer to new root stylesheet
*/
virtual void
setStylesheetRoot(const StylesheetRoot* theStylesheet) = 0;
/**
* Set the execution context. Must be set if after calling
* setStylesheetRoot.
*
* @param theExecutionContext pointer to new execution context.
*/
virtual void
setExecutionContext(StylesheetExecutionContext* theExecutionContext) = 0;
/**
* Resolve the params that were pushed by the caller.
*/
virtual void
resolveTopLevelParams(StylesheetExecutionContext& executionContext) = 0;
/**
* Get the XML Parser Liaison that this processor uses.
*
* @return XML parser liaison object
*/
virtual XMLParserLiaison&
getXMLParserLiaison() const = 0;
/**
* Generate a random namespace prefix guaranteed to be unique.
*
* @return unique namespace prefix
*/
virtual const XalanDOMString
getUniqueNamespaceValue() = 0;
/**
* Generate a random namespace prefix guaranteed to be unique.
*
* @param theValue A string for returning the new prefix
*/
virtual void
getUniqueNamespaceValue(XalanDOMString& theValue) = 0;
/**
* Push a top-level stylesheet parameter. This value can be evaluated via
* xsl:param-variable.
*
* @param key name of the parameter
* @param value XObject value for parameter
*/
virtual void
setStylesheetParam(
const XalanDOMString& key,
XObjectPtr value) = 0;
/**
* Push a top-level stylesheet parameter. This value can be evaluated via
* xsl:param-variable.
*
* @param key name of the param
* @param expression expression that will be evaluated
*/
virtual void
setStylesheetParam(
const XalanDOMString& key,
const XalanDOMString& expression) = 0;
/**
* Tells, through the combination of the default-space attribute on
* xsl:stylesheet, xsl:strip-space, xsl:preserve-space, and the xml:space
* attribute, whether or not extra whitespace should be stripped from the
* node. Literal elements from template elements should <em>not</em> be
* tested with this function.
*
* @param executionContext current execution context
* @param node text node from the source tree
* @return true if the text node should be stripped of extra whitespace
*
* $$$ ToDo: This has no business being here in the engine...
*/
virtual bool
shouldStripSourceNode(
XPathExecutionContext& executionContext,
const XalanNode& node) const = 0;
/**
* Get the current formatter listener.
*
* @return pointer to formatter listener
*/
virtual FormatterListener*
getFormatterListener() const = 0;
/**
* Set the current formatter listener.
*
* @param flistener pointer to new formatter listener
*/
virtual void
setFormatterListener(FormatterListener* flistener) = 0;
/**
* Determine the number of trace listeners.
*
* @return number of listeners
*/
virtual size_type
getTraceListeners() const = 0;
/**
* Add a trace listener for the purposes of debugging and diagnosis.
*
* @param tl pointer to listener to add
*/
virtual void
addTraceListener(TraceListener* tl) = 0;
/**
* Remove a trace listener.
*
* @param tl Trace listener to be removed.
*/
virtual void
removeTraceListener(TraceListener* tl) = 0;
/**
* Fire a generate event.
*
* @param ge generate event to fire
*/
virtual void
fireGenerateEvent(const GenerateEvent& ge) = 0;
/**
* Fire a trace event.
*
* @param te trace event to fire
*/
virtual void
fireTraceEvent(const TracerEvent& te) = 0;
/**
* Fire a selection event.
*
* @param se selection event to fire
*/
virtual void
fireSelectEvent(const SelectionEvent& se) = 0;
/**
* If this is set to true, simple traces of template calls are made.
*
* @return true if traces made
*/
virtual bool
getTraceSelects() const = 0;
/**
* Compose a diagnostic trace of the current selection
*
* @param theTemplate current context node
* @param nl list of selected nodes
*/
virtual void
traceSelect(
const XalanElement& theTemplate,
const NodeRefListBase& nl) const = 0;
/**
* If the quietConflictWarnings property is set to
* true, warnings about pattern conflicts won't be
* printed to the diagnostics stream.
* True by default.
*
* @param b true if conflict warnings should be suppressed.
*/
virtual void
setQuietConflictWarnings(bool b) = 0;
/**
* If this is set, diagnostics will be
* written to the m_diagnosticsPrintWriter stream. If
* the value is null, then diagnostics will be turned
* off.
*
* @param pw pointer to print writer
*/
virtual void
setDiagnosticsOutput(PrintWriter* pw) = 0;
/**
* Report a message.
*
* @param msg text of message to output
* @param sourceNode node in source where message occurred
* @param styleNode node in stylesheet where message occurred
*/
virtual void
message(
const XalanDOMString& msg,
const XalanNode* sourceNode = 0,
const XalanNode* styleNode = 0) const = 0;
/**
* Report a message.
*
* @param msg text of message to output
* @param sourceNode node in source where message occurred
* @param styleNode node in stylesheet where message occurred
*/
virtual void
message(
const XalanDOMString& msg,
const XalanNode* sourceNode,
const ElemTemplateElement* styleNode) const = 0;
/**
* Report a message.
*
* @param msg text of message to output
* @param locator A Locator for error reporting
* @param sourceNode node in source where message occurred
*/
virtual void
message(
const XalanDOMString& msg,
const Locator& locator,
const XalanNode* sourceNode = 0) const = 0;
/**
* Report a warning.
*
* @param msg text of message to output
* @param sourceNode node in source where the warning occurred
* @param styleNode node in stylesheet where the warning occurred
*/
virtual void
warn(
const XalanDOMString& msg,
const XalanNode* sourceNode = 0,
const XalanNode* styleNode = 0) const = 0;
/**
* Report a warning.
*
* @param msg text of message to output
* @param sourceNode node in source where warning occurred
* @param styleNode node in stylesheet where warning occurred
*/
virtual void
warn(
const XalanDOMString& msg,
const XalanNode* sourceNode,
const ElemTemplateElement* styleNode) const = 0;
/**
* Report a warning.
*
* @param msg text of message to output
* @param locator A Locator for error reporting
* @param sourceNode node in source where error occurred
*/
virtual void
warn(
const XalanDOMString& msg,
const Locator& locator,
const XalanNode* sourceNode = 0) const = 0;
/**
* Report an error and throw an exception.
*
* @param msg text of message to output
* @param sourceNode node in source where error occurred
* @param styleNode node in stylesheet where error occurred
*/
virtual void
error(
const XalanDOMString& msg,
const XalanNode* sourceNode = 0,
const XalanNode* styleNode = 0) const = 0;
/**
* Report an error and throw an exception.
*
* @param msg text of message to output
* @param sourceNode node in source where error occurred
* @param styleNode node in stylesheet where error occurred
*/
virtual void
error(
const XalanDOMString& msg,
const XalanNode* sourceNode,
const ElemTemplateElement* styleNode) const = 0;
/**
* Report an error and throw an exception.
*
* @param msg text of message to output
* @param locator A Locator for error reporting
* @param sourceNode node in source where error occurred
*/
virtual void
error(
const XalanDOMString& msg,
const Locator& locator,
const XalanNode* sourceNode = 0) const = 0;
};
#endif // XALAN_XSLTPROCESSOR_HEADER_GUARD