blob: e511e28e48719ae94ee19d0cbc5e74d8a24594f3 [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_STYLESHEET_HEADER_GUARD)
#define XALAN_STYLESHEET_HEADER_GUARD
// Base include file. Must be first.
#include "XSLTDefinitions.hpp"
#include <deque>
#include <map>
#include <vector>
#include <XalanDOM/XalanDocument.hpp>
#include <XalanDOM/XalanEmptyNamedNodeMap.hpp>
#include <XalanDOM/XalanNodeListSurrogate.hpp>
#include <PlatformSupport/PrefixResolver.hpp>
#include <XPath/NameSpace.hpp>
#include <XPath/XalanQNameByReference.hpp>
#include "NamespacesHandler.hpp"
#include "KeyDeclaration.hpp"
#include "StylesheetExecutionContext.hpp"
class AttributeList;
class ExtensionNSHandler;
class XalanDecimalFormatSymbols;
class ElemAttributeSet;
class ElemDecimalFormat;
class ElemTemplate;
class ElemTemplateElement;
class ElemVariable;
class KeyTable;
class NodeRefListBase;
class PrefixResolver;
class StylesheetConstructionContext;
class StylesheetRoot;
class XMLURL;
class XObject;
class XPath;
class StylesheetExecutionContext;
/**
* This class represents the base stylesheet or an "import" stylesheet.
* "include" stylesheets are combined with the including stylesheet.
*/
class XALAN_XSLT_EXPORT Stylesheet : public XalanDocument, protected PrefixResolver
{
public:
typedef StylesheetExecutionContext::ParamVectorType ParamVectorType;
typedef NamespacesHandler::NamespaceVectorType NamespaceVectorType;
typedef NamespacesHandler::NamespacesStackType NamespacesStackType;
#if defined(XALAN_NO_NAMESPACES)
typedef map<XalanDOMString,
XalanDOMString,
less<XalanDOMString> > StringToStringMapType;
typedef map<XalanDOMString,
ExtensionNSHandler*,
less<XalanDOMString> > ExtensionNamespacesMapType;
typedef map<XalanQNameByReference,
ElemTemplate*,
less<XalanQName> > ElemTemplateMapType;
typedef vector<ElemAttributeSet*> AttributeSetVectorType;
typedef vector<ElemVariable*> ElemVariableVectorType;
typedef vector<KeyDeclaration> KeyDeclarationVectorType;
typedef map<const XalanNode*,
KeyTable*,
less<const XalanNode*> > KeyTablesTableType;
typedef vector<XalanQNameByValue> QNameVectorType;
typedef vector<Stylesheet*> StylesheetVectorType;
typedef vector<XalanDOMString> URLStackType;
typedef vector<const XPath*> XPathVectorType;
typedef vector<ElemDecimalFormat*> ElemDecimalFormatVectorType;
#else
typedef std::map<XalanDOMString, XalanDOMString> StringToStringMapType;
typedef std::map<XalanDOMString, ExtensionNSHandler*> ExtensionNamespacesMapType;
typedef std::map<XalanQNameByReference, ElemTemplate*> ElemTemplateMapType;
typedef std::vector<ElemAttributeSet*> AttributeSetVectorType;
typedef std::vector<ElemVariable*> ElemVariableVectorType;
typedef std::vector<KeyDeclaration> KeyDeclarationVectorType;
typedef std::map<const XalanNode*, KeyTable*> KeyTablesTableType;
typedef std::vector<XalanQNameByValue> QNameVectorType;
typedef std::vector<Stylesheet*> StylesheetVectorType;
typedef std::vector<XalanDOMString> URLStackType;
typedef std::vector<const XPath*> XPathVectorType;
typedef std::vector<ElemDecimalFormat*> ElemDecimalFormatVectorType;
#endif
/**
* Constructor for a Stylesheet needs a Document.
* @exception XSLProcessorException thrown if the active ProblemListener and XMLParserLiaison decide
* the error condition is severe enough to halt processing.
*/
Stylesheet(
StylesheetRoot& root,
const XalanDOMString& baseIdentifier,
StylesheetConstructionContext& constructionContext);
virtual
~Stylesheet();
/**
* Retrieve XSLT version number
*
* @return number representing XSLT version
*/
double
getXSLTVerDeclared() const
{
return m_XSLTVerDeclared;
}
/**
* Set XSLT version number
*
* @param ver number representing XSLT version
*/
void
setXSLTVerDeclared(double ver)
{
m_XSLTVerDeclared = ver;
}
/**
* Retrieve the root stylesheet object
*
* @return const reference to the stylesheet object
*/
const StylesheetRoot&
getStylesheetRoot() const
{
return m_stylesheetRoot;
}
/**
* Retrieve the root stylesheet object
*
* @return reference to the stylesheet object
*/
StylesheetRoot&
getStylesheetRoot()
{
return m_stylesheetRoot;
}
/**
* Retrieve the stack of namespace lists
*
* @return vector of namespace vectors
*/
const NamespacesStackType&
getNamespaces() const
{
return m_namespaces;
}
/**
* Retrieve the stack of namespace lists
*
* @return vector of namespace vectors
*/
NamespacesStackType&
getNamespaces()
{
return m_namespaces;
}
const NamespacesHandler&
getNamespacesHandler() const
{
return m_namespacesHandler;
}
NamespacesHandler&
getNamespacesHandler()
{
return m_namespacesHandler;
}
/**
* Retrieve the list of namespace declarations currently in effect
*
* @return vector of namespace vectors
*/
const NamespaceVectorType&
getNamespaceDecls() const
{
return m_namespaceDecls;
}
/**
* Retrieve the list of namespace declarations currently in effect
*
* @return vector of namespace vectors
*/
NamespaceVectorType&
getNamespaceDecls()
{
return m_namespaceDecls;
}
/**
* Set the list of namespace declarations currently in effect
*
* @param ns vector of namespace vectors
*/
void
setNamespaceDecls(const NamespaceVectorType& ns)
{
m_namespaceDecls = ns;
}
/*
* Get the top entry on the namespace stack, or 0, if
* there is nothing on the stack.
*/
const NamespaceVectorType&
getCurrentNamespace() const
{
return m_namespaces.size() > 0 ? m_namespaces.back() : s_emptyNamespace;
}
/**
* Push the namespace declarations from the current attribute
* list onto the namespace stack.
*
* @param atts attribute list constaining namespaces
*/
void
pushNamespaces(const AttributeList& atts);
/**
* Pop a namespace declaration from the namespace stack.
*/
void
popNamespaces()
{
assert(m_namespaces.empty() == false);
m_namespaces.pop_back();
}
/**
* Called after construction is completed.
*/
virtual void
postConstruction(StylesheetConstructionContext& constructionContext);
/**
* See if this is a xmlns attribute, and, if so, process it.
*
* @param attrName qualified name of attribute
* @param atts attribute list where the element comes from (not used at
* this time)
* @param which index into the attribute list (not used at this time)
* @return true if this is a namespace name
*/
bool
isAttrOK(
const XalanDOMChar* attrName,
const AttributeList& atts,
int which,
StylesheetConstructionContext& constructionContext) const;
/**
* Get the namespace from a qualified name.
*
* @param nodeName name of node
* @return namespace string for node, or null if not found.
*/
const XalanDOMString*
getNamespaceFromStack(const XalanDOMString& nodeName) const
{
return getNamespaceFromStack(c_wstr(nodeName));
}
/**
* Get the namespace from a qualified name.
*
* @param nodeName name of node
* @return namespace string for node, or null if not found.
*/
const XalanDOMString*
getNamespaceFromStack(const XalanDOMChar* nodeName) const;
/**
* Get the namespace from a prefix by searching the stack of namespace
* lists.
*
* @param prefix prefix to search
* @return namespace corresponding to prefix, or null if not found.
*/
const XalanDOMString*
getNamespaceForPrefixFromStack(const XalanDOMString& prefix) const
{
return XalanQName::getNamespaceForPrefix(m_namespaces, prefix);
}
/**
* Get the namespace from a prefix by searching the stack of namespace
* lists.
*
* @param prefix prefix to search
* @return namespace corresponding to prefix, or null if not found.
*/
const XalanDOMString*
getNamespaceForPrefixFromStack(const XalanDOMChar* prefix) const
{
assert(prefix != 0);
return XalanQName::getNamespaceForPrefix(m_namespaces, XalanDOMString(prefix));
}
/**
* See if there is a namespace alias.
*
* @param uri the URI of the namespace.
* @return the alias URI, if found.
*/
XalanDOMString
getAliasNamespaceURI(const XalanDOMChar* uri) const;
/**
* See if there is a namespace alias.
*
* @param uri the URI of the namespace.
* @return the alias URI, if found.
*/
XalanDOMString
getAliasNamespaceURI(const XalanDOMString& uri) const;
/**
* See if a namespace should be excluded.
*
* @param theValue the prefix of the namespace.
* @param theConstructionContext the current construction context.
* @return
*/
void
processExcludeResultPrefixes(
const XalanDOMChar* theValue,
StylesheetConstructionContext& theConstructionContext)
{
m_namespacesHandler.processExcludeResultPrefixes(
theValue,
m_namespaces,
theConstructionContext);
}
/**
* Add a template to the list of names templates
*
* @param theTemplate template to add
* @param constructionContext context for construction
*/
void
addTemplate(
ElemTemplate* theTemplate,
StylesheetConstructionContext& constructionContext);
/**
* Process an attribute that has the value of 'yes' or 'no'.
*
* @param aname name of attribute
* @param val value
* @param constructionContext context for construction
* @return true if value equals string constant for "yes," false otherwise
*/
bool
getYesOrNo(
const XalanDOMChar* aname,
const XalanDOMChar* val,
StylesheetConstructionContext& constructionContext) const;
/**
* Tell if this is the root of the stylesheet tree.
*
* @return true if it is the root
*/
bool
isRoot() const
{
return m_isRoot;
}
/**
* Retrieve the base identifier with which this stylesheet is associated.
*
* @return string for base identifier
*/
const XalanDOMString&
getBaseIdentifier() const
{
return m_baseIdent;
}
/**
* Set the base identifier with which this stylesheet is associated.
*
* @param str string for base identifier
*/
void
setBaseIdentifier(const XalanDOMString& str)
{
m_baseIdent = str;
}
/**
* Retrieve the base identifier for the most recently
* included stylesheet. This will return the same value
* as getBaseIdentifier(), if no include is being
* processed.
*
* @return string for base identifier
*/
const XalanDOMString&
getCurrentIncludeBaseIdentifier() const
{
return m_includeStack.size() == 0 ? getBaseIdentifier() : m_includeStack.back();
}
/**
* Process an xsl:namespace-alias element.
*
* @param name the element name.
* @param attrs the current attribute list
* @param constructionContext the active construction context
*/
void
processNSAliasElement(
const XalanDOMChar* name,
const AttributeList& atts,
StylesheetConstructionContext& constructionContext);
/**
* Process an xsl:decimal-format element.
*
* @param elemDecimalFormat the element
*/
void
processDecimalFormatElement(ElemDecimalFormat* elemDecimalFormat)
{
assert(elemDecimalFormat != 0);
m_elemDecimalFormats.push_back(elemDecimalFormat);
}
/**
* Retrieve the XalanDecimalFormatSymbols instance associated with
* the QName.
*
* @param theQName the QName for the lookup
* @return a pointer to the matching instance, or 0 if none was found
*/
const XalanDecimalFormatSymbols*
getDecimalFormatSymbols(const XalanQName& theQName) const;
/**
* Add an attribute set to the list.
*
* @param attrSet pointer to attribute set to add
*/
void
addAttributeSet(ElemAttributeSet* attrSet)
{
assert(attrSet != 0);
m_attributeSets.push_back(attrSet);
}
/**
* Apply the set of named attributes to a node in a given context with a
* given mode
*
* @param attributeSetsNames list of attribute set names
* @param executionContext current execution context
* @param sourceNode source node
*/
void
applyAttrSets(
const QNameVectorType& attributeSetsNames,
StylesheetExecutionContext& executionContext,
XalanNode* sourceNode) const;
/**
* Add an imported stylesheet.
*
* @param theStylesheet The stylesheet to add.
* @param fFront If true, the stylesheet is added to the front of the imports, instead of the end.
*/
void
addImport(
Stylesheet* theStylesheet,
bool fFront)
{
m_imports.insert(fFront ? m_imports.begin() : m_imports.end(), theStylesheet);
}
/**
* Retrieve the manufactured template to use if there is no wrapper.
*
* @return pointer to template
*/
const ElemTemplate*
getWrapperlessTemplate()
{
return m_wrapperlessTemplate;
}
/**
* Set the manufactured template to use if there is no wrapper.
*
* @param templ template to use
*/
void
setWrapperlessTemplate(ElemTemplate* templ)
{
m_wrapperlessTemplate = templ;
}
/**
* whether there is a wrapper template
*
* @return true is there is a wrapper
*/
bool
isWrapperless() const
{
return m_isWrapperless;
}
/**
* Set whether there is a wrapper template
*
* @param b true is there is a wrapper
*/
void
setWrapperless(bool b)
{
m_isWrapperless = b;
}
/**
* Retrieve the stack of who's including who
*
* @return stack of includes
*/
URLStackType&
getIncludeStack()
{
return m_includeStack;
}
/**
* Process the xsl:key element.
*
* @param nsContext element providing context for namespaces
* @param atts attribute list for element
* @param constructionContext context for evaluation
*/
/*
* (Notes to myself)
* What we need to do is:
* 1) As this function is called, build a table of KeyDeclarations.
* 2) During either XML processing, or upon request, walk the XML
* document tree, and build a hash table:
* a) keyed by name,
* b) each with a value of a hashtable, keyed by the value returned by
* the use attribute,
* c) each with a value that is a nodelist.
* Thus, for a given key or keyref, look up hashtable by name,
* look up the nodelist by the given reference.
*/
void
processKeyElement(
ElemTemplateElement* nsContext,
const AttributeList& atts,
StylesheetConstructionContext& constructionContext);
/**
* Locate a template via the "name" attribute.
*
* @param name qualified name of template
* @return pointer to template found or 0 if none found
*/
const ElemTemplate*
findNamedTemplate(const XalanQName& qname) const;
/**
* Given a target element, find the template that best matches in the given
* XSL document, according to the rules specified in the xsl draft.
*
* @param executionContext current execution context
* @param targetNode element that needs a rule
* @return pointer to rule that best matches targetNode
*/
const ElemTemplate*
findTemplate(
StylesheetExecutionContext& executionContext,
XalanNode* targetNode) const
{
return findTemplate(executionContext, targetNode, s_emptyQName, false);
}
/**
* Given a target element, find the template that best matches in the given
* XSL document, according to the rules specified in the xsl draft.
*
* @param executionContext current execution context
* @param targetElem element that needs a rule
* @param mode string indicating the display mode
* @param onlyUseImports only use imports, do not use any templates from the stylesheet itself
* @return pointer to rule that best matches targetElem
*/
const ElemTemplate*
findTemplate(
StylesheetExecutionContext& executionContext,
XalanNode* targetNode,
const XalanQName& mode,
bool onlyUseImports) const;
/**
* A class to contain a match pattern and it's corresponding template.
* This class also defines a node in a match pattern linked list.
*/
class MatchPattern2
{
public:
/**
* Construct a match pattern from a pattern and template.
*
* @param theTemplate node that contains the template for this pattern
* @param posInStylesheet position in stylesheet
* @param targetString target string
* @param matchPattern the match pattern
* @param pattern the pattern string
*/
MatchPattern2(
const ElemTemplate& theTemplate,
int posInStylesheet,
const XalanDOMString& targetString,
const XPath& matchPattern,
const XalanDOMString& pattern) :
m_template(&theTemplate),
m_posInStylesheet(posInStylesheet),
m_targetString(targetString),
m_matchPattern(&matchPattern),
m_pattern(&pattern)
{
}
MatchPattern2() :
m_template(0),
m_posInStylesheet(0),
m_targetString(),
m_matchPattern(0),
m_pattern(0)
{
}
~MatchPattern2()
{
}
/**
* Retrieve string for target.
*
* @return target string
*/
const XalanDOMString&
getTargetString() const
{
return m_targetString;
}
/**
* Retrieve the match pattern associated with pattern.
*
* @return XPath for pattern
*/
const XPath*
getExpression() const
{
return m_matchPattern;
}
/**
* Retrieve position of pattern in stylesheet.
*
* @return position in stylesheet
*/
int
getPositionInStylesheet() const
{
return m_posInStylesheet;
}
/**
* Retrieve pattern string.
*
* @return string that contains element pattern
*/
const XalanDOMString*
getPattern() const
{
return m_pattern;
}
/**
* Retrieve node that contains the template for this pattern.
*
* @return template node
*/
const ElemTemplate*
getTemplate() const
{
return m_template;
}
private:
const ElemTemplate* m_template;
int m_posInStylesheet;
XalanDOMString m_targetString;
const XPath* m_matchPattern;
const XalanDOMString* m_pattern;
};
#if defined(XALAN_NO_NAMESPACES)
typedef vector<const MatchPattern2*> PatternTableListType;
typedef vector<const MatchPattern2*> PatternTableVectorType;
typedef map<XalanDOMString,
PatternTableListType,
less<XalanDOMString> > PatternTableMapType;
typedef deque<MatchPattern2> MatchPattern2Container;
#else
typedef std::vector<const MatchPattern2*> PatternTableListType;
typedef std::vector<const MatchPattern2*> PatternTableVectorType;
typedef std::map<XalanDOMString,
PatternTableListType> PatternTableMapType;
typedef std::deque<MatchPattern2> MatchPattern2Container;
#endif
/**
* Add object to vector of match patterns if not already there.
*
* @param thePattern pattern to add
* @param theVector vector of patterns to add to
*/
static void
addObjectIfNotFound(
const MatchPattern2* thePattern,
PatternTableVectorType& theVector);
/**
* Add object to array of match patterns if not already there.
* theArraySize size will be incremented if the pattern was
* added.
*
* @param thePattern pattern to add
* @param theArray vector of patterns to add to
* @param theArraySize The size of the array
*/
static void
addObjectIfNotFound(
const MatchPattern2* thePattern,
const MatchPattern2* theArray[],
unsigned int& theArraySize);
/**
* Given a name, locate the start of a list of
* possible templates that match that name. If
* none match, then use the default list.
*
* @param theName The name to match
*/
const PatternTableListType*
locateMatchPatternList2(const XalanDOMString& theName) const;
/**
* Given a XalanNode, locate the start of a list of
* possible templates that match it.
*
* @param XalanNode The node to match
*/
const PatternTableListType*
locateMatchPatternList2(const XalanNode& theNode) const;
/**
* Add an extension namespace handler. This provides methods for calling
* an element extension as well as for function calls (which is passed
* on to XPath).
*
* @param uri the URI of the extension namespace
* @param nsh handler
*/
void
addExtensionNamespace(
const XalanDOMString& uri,
ExtensionNSHandler* nsh);
/**
* Return the handler for a given extension namespace.
*
* @param uri the URI of the extension namespace.
* @return pointer to extension handler
*/
ExtensionNSHandler*
lookupExtensionNSHandler(const XalanDOMString& uri) const
{
const ExtensionNamespacesMapType::const_iterator it =
m_extensionNamespaces.find(uri);
return it == m_extensionNamespaces.end() ? 0 : (*it).second;
}
/**
* Set a top level variable, to be serialized with the rest of the
* stylesheet.
*
* @param var top-level variable declared with "xsl:variable" or
* xsl:param-variable.
*/
void
setTopLevelVariable(ElemVariable* var)
{
m_topLevelVariables.push_back(var);
}
/**
* Set a list of top level variables in the specified execution context
* stylesheet.
*
* @param executionContext current execution context
* @param topLevelParams list of top level parameters
*/
void
pushTopLevelVariables(
StylesheetExecutionContext& executionContext,
const ParamVectorType& topLevelParams) const;
const XPathVectorType&
getWhitespacePreservingElements() const
{
return m_whitespacePreservingElements;
}
void
pushWhitespacePreservingElement(const XPath* theXPath)
{
m_whitespacePreservingElements.push_back(theXPath);
}
const XPathVectorType&
getWhitespaceStrippingElements() const
{
return m_whitespaceStrippingElements;
}
void
pushWhitespaceStrippingElement(const XPath* theXPath)
{
m_whitespaceStrippingElements.push_back(theXPath);
}
// These interfaces are inherited from XalanDocument...
virtual const XalanDOMString&
getNodeName() const;
virtual const XalanDOMString&
getNodeValue() const;
virtual NodeType
getNodeType() const;
virtual XalanNode*
getParentNode() const;
virtual const XalanNodeList*
getChildNodes() const;
virtual XalanNode*
getFirstChild() const;
virtual XalanNode*
getLastChild() const;
virtual XalanNode*
getPreviousSibling() const;
virtual XalanNode*
getNextSibling() const;
virtual const XalanNamedNodeMap*
getAttributes() const;
virtual XalanDocument*
getOwnerDocument() const;
#if defined(XALAN_NO_COVARIANT_RETURN_TYPE)
virtual XalanNode*
#else
virtual Stylesheet*
#endif
cloneNode(bool deep) const;
virtual XalanNode*
insertBefore(
XalanNode* newChild,
XalanNode* refChild);
virtual XalanNode*
replaceChild(
XalanNode* newChild,
XalanNode* oldChild);
virtual XalanNode*
removeChild(XalanNode* oldChild);
virtual XalanNode*
appendChild(XalanNode* newChild);
virtual bool
hasChildNodes() const;
virtual void
setNodeValue(const XalanDOMString& nodeValue);
virtual void
normalize();
virtual bool
supports(
const XalanDOMString& feature,
const XalanDOMString& version) const;
virtual const XalanDOMString&
getNamespaceURI() const;
virtual const XalanDOMString&
getPrefix() const;
virtual const XalanDOMString&
getLocalName() const;
virtual void
setPrefix(const XalanDOMString& prefix);
virtual unsigned long
getIndex() const;
virtual XalanElement*
createElement(const XalanDOMString& tagName);
virtual XalanDocumentFragment*
createDocumentFragment();
virtual XalanText*
createTextNode(const XalanDOMString& data);
virtual XalanComment*
createComment(const XalanDOMString& data);
virtual XalanCDATASection*
createCDATASection(const XalanDOMString& data);
virtual XalanProcessingInstruction*
createProcessingInstruction(
const XalanDOMString& target,
const XalanDOMString& data);
virtual XalanAttr*
createAttribute(const XalanDOMString& name);
virtual XalanEntityReference*
createEntityReference(const XalanDOMString &name);
virtual XalanDocumentType*
getDoctype() const;
virtual XalanDOMImplementation*
getImplementation() const;
virtual XalanElement*
getDocumentElement() const;
virtual XalanNodeList*
getElementsByTagName(const XalanDOMString& tagname) const;
virtual XalanNode*
importNode(
XalanNode* importedNode,
bool deep);
virtual XalanElement*
createElementNS(
const XalanDOMString& namespaceURI,
const XalanDOMString& qualifiedName);
virtual XalanAttr*
createAttributeNS(
const XalanDOMString& namespaceURI,
const XalanDOMString& qualifiedName);
virtual XalanNodeList*
getElementsByTagNameNS(
const XalanDOMString& namespaceURI,
const XalanDOMString& localName) const;
virtual XalanElement*
getElementById(const XalanDOMString& elementId) const;
virtual unsigned long
getNumber() const;
virtual bool
isIndexed() const;
// These interfaces are inherited from PrefixResolver...
virtual const XalanDOMString*
getNamespaceForPrefix(const XalanDOMString& prefix) const;
virtual const XalanDOMString&
getURI() const;
const XalanDOMString&
getXSLTNamespaceURI() const
{
return m_XSLTNamespaceURI;
}
void
setXSLTNamespaceURI(const XalanDOMString& theURI)
{
m_XSLTNamespaceURI = theURI;
}
protected:
/**
* The root of the stylesheet tree.
*/
StylesheetRoot& m_stylesheetRoot;
/**
* The base URL of the XSL document.
*/
XalanDOMString m_baseIdent;
/**
* Table of KeyDeclaration objects, which are set by the
* xsl:key element.
*/
KeyDeclarationVectorType m_keyDeclarations;
static const XalanQNameByReference s_emptyQName;
private:
// Not defined...
Stylesheet(const Stylesheet&);
Stylesheet&
operator=(const Stylesheet&);
bool
operator==(const Stylesheet&) const;
/**
* The full XSLT Namespace URI. To be replaced by the one actually
* found.
*/
XalanDOMString m_XSLTNamespaceURI;
/**
* A lookup table of all space preserving elements.
*/
XPathVectorType m_whitespacePreservingElements;
/**
* A lookup table of all space stripping elements.
*/
XPathVectorType m_whitespaceStrippingElements;
/**
* A vector of the -imported- XSL Stylesheets.
*/
StylesheetVectorType m_imports;
StylesheetVectorType::size_type m_importsSize;
/**
* A stack to keep track of the result tree namespaces.
*/
NamespacesStackType m_namespaces;
/**
* A list of namespace declarations,
* for mapping from prefix to namespace URI.
*/
NamespaceVectorType m_namespaceDecls;
/**
* This is pushed on the m_resultNameSpaces stack 'till a xmlns attribute is
* found.
*/
static const NamespaceVectorType s_emptyNamespace;
/**
* Tells if the stylesheet is without an xsl:stylesheet and xsl:template
* wrapper.
*/
bool m_isWrapperless;
/**
* The manufactured template if there is no wrapper.
*/
ElemTemplate* m_wrapperlessTemplate;
/**
* The table of extension namespaces.
*/
ExtensionNamespacesMapType m_extensionNamespaces;
/**
* The first template of the template children.
*/
ElemTemplateElement* m_firstTemplate;
/**
* A stack of who's including who is needed in order to support "It is an
* error if a stylesheet directly or indirectly includes itself."
*/
URLStackType m_includeStack;
/**
* Keyed on string macro names, and holding values that are macro elements
* in the XSL DOM tree. Initialized in initMacroLookupTable, and used in
* findNamedTemplate.
*/
ElemTemplateMapType m_namedTemplates;
/**
* Table for defined constants, keyed on the names.
*/
ElemVariableVectorType m_topLevelVariables;
/**
* The version of XSL that was declared.
*/
double m_XSLTVerDeclared;
const bool m_isRoot;
/**
* This table is keyed on the target elements of patterns, and contains linked
* lists of the actual patterns that match the target element to some degree
* of specifity.
*/
PatternTableMapType m_patternTable;
const PatternTableMapType::const_iterator m_patternTableEnd;
/**
* These tables are for text, comment, root, and PI node templates.
*/
PatternTableListType m_textPatternList;
PatternTableListType m_commentPatternList;
PatternTableListType m_rootPatternList;
PatternTableListType m_piPatternList;
/**
* This table is for patterns that match "node()". Once
* all of the templates have been processed, we'll combine
* this list with m_anyPatternList, and use that for Element
* and Attribute nodes which don't have a specific template.
*/
PatternTableListType m_nodePatternList;
/**
* This table is for patterns that match "*"
*/
PatternTableListType m_anyPatternList;
/**
* This will hold all of the MatchPattern2 instances for the
* stylesheet.
*/
MatchPattern2Container m_matchPattern2Container;
/**
* This caches the number of possible patterns we can match.
*/
MatchPattern2Container::size_type m_patternCount;
AttributeSetVectorType m_attributeSets;
AttributeSetVectorType::size_type m_attributeSetsSize;
XalanNodeListSurrogate m_surrogateChildren;
ElemDecimalFormatVectorType m_elemDecimalFormats;
StringToStringMapType m_prefixAliases;
NamespacesHandler m_namespacesHandler;
static const XalanDOMString s_emptyString;
static const XalanEmptyNamedNodeMap s_fakeAttributes;
};
#endif // XALAN_STYLESHEET_HEADER_GUARD