/* * Licensed to the Apache Software Foundation (ASF) under one * or more contributor license agreements. See the NOTICE file * distributed with this work for additional information * regarding copyright ownership. The ASF licenses this file * to you under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ #if !defined(STYLESHEETCONSTRUCTIONCONTEXT_HEADER_GUARD_1357924680) #define STYLESHEETCONSTRUCTIONCONTEXT_HEADER_GUARD_1357924680 // Base include file. Must be first. #include #include #include #include #include #include namespace XERCES_CPP_NAMESPACE { class AttributeList; class DocumentHandler; class Locator; } namespace XALAN_CPP_NAMESPACE { typedef xercesc::AttributeList AttributeListType; typedef xercesc::DocumentHandler DocumentHandlerType; using xercesc::AttributeList; using xercesc::DocumentHandler; using xercesc::Locator; class AVT; class AVTPart; class ElemTemplate; class ElemTemplateElement; class ExtensionNSHandler; class PrefixResolver; class Stylesheet; class StylesheetRoot; class XalanDocument; class XalanMatchPatternData; class XalanNode; class XSLTInputSource; // // An abstract class which provides support for constructing the internal // representation of a stylesheet. // class XALAN_XSLT_EXPORT StylesheetConstructionContext : public XPathConstructionContext { public: typedef XalanQName::NamespacesStackType NamespacesStackType; /** * IDs for XSL element types. These are the values * that must be returned by getElementToken(). */ enum eElementToken { ELEMNAME_UNDEFINED = -2, ELEMNAME_EMPTY = -1, ELEMNAME_WITH_PARAM, ELEMNAME_APPLY_TEMPLATES, ELEMNAME_CHOOSE, ELEMNAME_COMMENT, ELEMNAME_COPY, ELEMNAME_COPY_OF, ELEMNAME_ATTRIBUTE, ELEMNAME_ATTRIBUTE_SET, ELEMNAME_EXTENSION, ELEMNAME_FOR_EACH, ELEMNAME_KEY, ELEMNAME_IF, ELEMNAME_IMPORT, ELEMNAME_INCLUDE, ELEMNAME_CALL_TEMPLATE, ELEMNAME_PARAM, ELEMNAME_NUMBER, ELEMNAME_OTHERWISE, ELEMNAME_PI, ELEMNAME_PRESERVE_SPACE, ELEMNAME_TEMPLATE, ELEMNAME_SORT, ELEMNAME_STRIP_SPACE, ELEMNAME_STYLESHEET, ELEMNAME_TEXT, ELEMNAME_VALUE_OF, ELEMNAME_WHEN, ELEMNAME_FALLBACK, ELEMNAME_ELEMENT, ELEMNAME_APPLY_IMPORTS, ELEMNAME_VARIABLE, ELEMNAME_MESSAGE, ELEMNAME_OUTPUT, ELEMNAME_DECIMAL_FORMAT, ELEMNAME_NAMESPACE_ALIAS, // This one doesn't really have a name. // It's used for any literal result // element. ELEMNAME_LITERAL_RESULT, // This one doesn't really have a name. // It's used for any literal text in // the content of a literal result // element. ELEMNAME_TEXT_LITERAL_RESULT, // This one doesn't really have a name. // It's used for forward-compatible // processing. ELEMNAME_FORWARD_COMPATIBLE, // Extension handling. ELEMNAME_EXTENSION_CALL, ELEMNAME_EXTENSION_HANDLER }; typedef URISupport::URLAutoPtrType URLAutoPtrType; explicit StylesheetConstructionContext(MemoryManager& theManager); virtual ~StylesheetConstructionContext(); // These are inherited from XPathConstructionContext... virtual void problem( eSource source, eClassification classification, const XalanDOMString& msg, const Locator* locator, const XalanNode* sourceNode) = 0; virtual void problem( eSource source, eClassification classification, const XalanDOMString& msg, const XalanNode* sourceNode) = 0; virtual void reset() = 0; virtual const XalanDOMString& getPooledString(const XalanDOMString& theString) = 0; virtual const XalanDOMString& getPooledString( const XalanDOMChar* theString, XalanDOMString::size_type theLength = XalanDOMString::npos) = 0; virtual XalanDOMString& getCachedString() = 0; virtual bool releaseCachedString(XalanDOMString& theString) = 0; /** * Create a new StylesheetRoot instance. The StylesheetConstructionContext * instance owns the StylesheetRoot instance, and will delete it when asked * or when the StylesheetConstructionContext instance is destroyed. * * @param theBaseIdentifier A URI to the stylesheet file. * @return A pointer to a new StylesheetRoot instance. */ virtual StylesheetRoot* create(const XalanDOMString& theBaseIdentifier) = 0; /** * Create a new StylesheetRoot instance. The StylesheetConstructionContext * instance owns the StylesheetRoot instance, and will delete it when asked * or when the StylesheetConstructionContext instance is destroyed. * * @param theInputSource A reference to the input source. * @return A pointer to a new StylesheetRoot instance. */ virtual StylesheetRoot* create(const XSLTInputSource& theInputSource) = 0; /** * Create a new Stylesheet instance. The StylesheetConstructionContext * instance owns the Stylesheet instance, and will delete it when asked * or when the StylesheetConstructionContext instance is destroyed. * * @param A reference to the StylesheetRoot instance. * @param theBaseIdentifier A URI to the stylesheet file. * @return A pointer to a new StylesheetRoot instance. */ virtual Stylesheet* create( StylesheetRoot& theStylesheetRoot, const XalanDOMString& theBaseIdentifier) = 0; /** * Destroy a StylesheetRoot instance. If this StylesheetConstructionContext * instance does not own the StylesheetRoot, it will not delete it * * @param theStylesheet A pointer to the StylesheetRoot instance to delete. */ virtual void destroy(StylesheetRoot* theStylesheetRoot) = 0; /** * Determine the fully qualified URI for a string. * * @param urlString string to qualify * @return auto pointer to fully qualified URI */ virtual URLAutoPtrType getURLFromString(const XalanDOMString& urlString) = 0; /** * Determine the fully qualified URI for a string. * * @param urlString string to qualify * @return string to fully qualified URI */ virtual XalanDOMString& getURLStringFromString( const XalanDOMString& urlString, XalanDOMString& theResult) = 0; /** * Determine the fully qualified URI for a string. * * @param urlString string to qualify * @param base base location for URI * @return auto pointer to fully qualified URI */ virtual URLAutoPtrType getURLFromString( const XalanDOMString& urlString, const XalanDOMString& base) = 0; /** * Determine the fully qualified URI for a string. * * @param urlString string to qualify * @param base base location for URI * @return string to fully qualified URI */ virtual XalanDOMString& getURLStringFromString( const XalanDOMString& urlString, const XalanDOMString& base, XalanDOMString& theResult) = 0; /** * Retrieve the URI for the current XSLT namespace, for example, * "http://www.w3.org/1999/XSL/Transform" * * @return URI string */ virtual const XalanDOMString& getXSLTNamespaceURI() const = 0; /** * Create and initialize an xpath for a match pattern and return it. This * is to be used by stylesheet elements that need an XPath that is * guaranteed to persist while it lives. * * @param locator the locator for the XPath. May be null. * @param str string to match * @param resolver resolver for namespace resolution * @param allowVariableReferences If true, variable references are allowed. * @param allowKeyFunction If true, calls to the key() function are allowed. * @return XPath for match pattern */ virtual XPath* createMatchPattern( const Locator* locator, const XalanDOMString& str, const PrefixResolver& resolver, bool allowVariableReferences = true, bool allowKeyFunction = true) = 0; /** * Create and initialize an xpath for a match pattern and return it. This * is to be used by stylesheet elements that need an XPath that is * guaranteed to persist while it lives. * * @param locator the locator for the XPath. May be null. * @param str string to match * @param resolver resolver for namespace resolution * @param allowVariableReferences If true, variable references are allowed. * @param allowKeyFunction If true, calls to the key() function are allowed. * @return XPath for match pattern */ virtual XPath* createMatchPattern( const Locator* locator, const XalanDOMChar* str, const PrefixResolver& resolver, bool allowVariableReferences = true, bool allowKeyFunction = true) = 0; /** * Create and initialize an xpath and return it. This is to be used by * stylesheet elements that need an XPath that is guaranteed to persist * while it lives. * * @param locator the locator for the XPath. May be null. * @param str string to match * @param resolver resolver for namespace resolution * @return XPath for string matched */ virtual XPath* createXPath( const Locator* locator, const XalanDOMString& str, const PrefixResolver& resolver, bool allowVariableReferences = true, bool allowKeyFunction = true) = 0; /** * Create and initialize an xpath and return it. This is to be used by * stylesheet elements that need an XPath that is guaranteed to persist * while it lives. * * @param locator the locator for the XPath. May be null. * @param str string to match * @param resolver resolver for namespace resolution * @return XPath for string matched */ virtual XPath* createXPath( const Locator* locator, const XalanDOMChar* str, const PrefixResolver& resolver, bool allowVariableReferences = true, bool allowKeyFunction = true) = 0; /** * Create and initialize an xpath and return it. This is to be used by * stylesheet elements that need an XPath that is guaranteed to persist * while it lives. * * @param locator the locator for the XPath. May be null. * @param str string to match * @param resolver resolver for namespace resolution * @return XPath for string matched */ virtual XPath* createXPath( const Locator* locator, const XalanDOMChar* str, XalanDOMString::size_type len, const PrefixResolver& resolver, bool allowVariableReferences = true, bool allowKeyFunction = true) = 0; /** * Get the locator from the top of the locator stack. * * @return A pointer to the Locator, or 0 if there is nothing on the stack. */ virtual const Locator* getLocatorFromStack() const = 0; /** * Push a locator on to the locator stack. * * @param A pointer to the Locator to push. */ virtual void pushLocatorOnStack(const Locator* locator) = 0; /** * Pop the locator from the top of the locator stack. */ virtual void popLocatorStack() = 0; /** * Get the Xalan namespace for built-in extensions. * * @return Xalan namespace for extensions */ virtual const XalanDOMString& getXalanXSLNameSpaceURL() const = 0; /** * Read in the XML file, either producing a Document or calling SAX events, * and register the document in a table. If the document has already been * read in, it will not be reparsed. * * @param urlString location of the XML * @param docHandler pointer to SAX event handler * @param docToRegister if using a SAX event handler, the object to register in the source docs table. * @return document object, which represents the parsed XML * @exception SAXException */ virtual XalanDocument* parseXML( const XalanDOMString& urlString, DocumentHandler* docHandler, XalanDocument* docToRegister, ErrorHandler* theErrorHandler = 0) = 0; /** * Given an name, determine if it is the xml:space attribute * * @param theAttributeName The name to check * @param theStylesheet The current Stylesheet instance * @param theLocator The Locator for error reporting. May be 0. * * @return true if the string is the xml:space attribute name */ virtual bool isXMLSpaceAttribute( const XalanDOMChar* theAttributeName, const Stylesheet& theStylesheet, const Locator* theLocator = 0) = 0; /** * Given an name, determine if it is the xsl:use-attribute-sets attribute * * @param theAttributeName The name to check * @param theStylesheet The current Stylesheet instance * @param theLocator The Locator for error reporting. May be 0. * * @return true if the string is the xsl:use-attribute-sets attribute name */ virtual bool isXSLUseAttributeSetsAttribute( const XalanDOMChar* theAttributeName, const Stylesheet& theStylesheet, const Locator* theLocator = 0) = 0; /** * Given an name, determine if it is a valid QName * * @param theName The name to check * @param theStylesheet The current Stylesheet instance * @param theLocator The Locator for error reporting. May be 0. * * @return true if the string is a valid QName. */ virtual bool isValidQName( const XalanDOMChar* theName, const Stylesheet& theStylesheet, const Locator* theLocator = 0) = 0; /** * Given an XSL tag name, return an integer token that corresponds to * the enums defined above. * * @param name a probable xsl:xxx element * @return The enum value for that token, or ELEMNAME_UNDEFINED */ virtual eElementToken getElementToken(const XalanDOMString& name) const = 0; /** * Get the latest XSLT version currently supported. * * @return XSLT version number */ virtual double getXSLTVersionSupported() const = 0; /** * Allocate a vector of XalanDOMChar of the specified * size. * * @param theLength The length of the character vector * @return A pointer to the vector. */ virtual XalanDOMChar* allocateXalanDOMCharVector(XalanDOMString::size_type theLength) = 0; /** * Allocate a vector of XalanDOMChar of the specified * size. * * @param theString The source character array * @param theLength The length of the character vector * @param fTerminate If true, terminate the new vector with 0 * @return A pointer to the array. */ virtual XalanDOMChar* allocateXalanDOMCharVector( const XalanDOMChar* theString, XalanDOMString::size_type theLength = XalanDOMString::npos, bool fTerminate = true) = 0; /** * Create an AVT instance. * * @param locator the Locator for the instance. May be null. * @param name name of AVT * @param stringedValue string value to parse * @param resolver resolver for namespace resolution * @return A pointer to the instance. */ virtual const AVT* createAVT( const Locator* locator, const XalanDOMChar* name, const XalanDOMChar* stringedValue, const PrefixResolver& resolver) = 0; /** * Create an AVTPart instance. * * @param theString The source character array * @param theLength The length of the character vector * @param fTerminate If true, terminate the new vector with 0 * @return A pointer to the instance. */ virtual const AVTPart* createAVTPart( const XalanDOMChar* theString, XalanDOMString::size_type theLength = XalanDOMString::npos) = 0; /** * Create an AVTPart instance. * * @param locator the Locator for the instance. May be null. * @param str The XPath expression for the instance * @param len The length of the expression * @param resolver resolver for namespace resolution * @return A pointer to the instance. */ virtual const AVTPart* createAVTPart( const Locator* locator, const XalanDOMChar* str, XalanDOMString::size_type len, const PrefixResolver& resolver) = 0; /** * Allocate a vector of const AVT* of the specified * length. * * @param theLength The length of the vector * @return A pointer to the vector. */ virtual const AVT** allocateAVTPointerVector(size_type theLength) = 0; /** * Allocate a vector of const AVTPart* of the specified * length. * * @param theLength The length of the vector * @return A pointer to the vector. */ virtual const AVTPart** allocateAVTPartPointerVector(size_type theLength) = 0; /** * Create a XalanQName-derived instance. * * @param qname The qname string * @param namespaces The stack of namespaces * @param Locator The current Locator, if any * @param fUseDefault If true, a qname without a prefix will use the default namespace * @return A pointer to the new instance */ virtual const XalanQName* createXalanQName( const XalanDOMString& qname, const NamespacesStackType& namespaces, const Locator* locator = 0, bool fUseDefault = false) = 0; /** * Create a XalanQName-derived instance. * * @param qname The qname string * @param namespaces The stack of namespaces * @param Locator The current Locator, if any * @param fUseDefault If true, a qname without a prefix will use the default namespace * @return A pointer to the new instance */ virtual const XalanQName* createXalanQName( const XalanDOMChar* qname, const NamespacesStackType& namespaces, const Locator* locator = 0, bool fUseDefault = false) = 0; /** * Tokenize a string and return the QNames corresponding to * those tokens. * * @param count The number of namespaces in the vector returned * @param qnameTokens The string to tokenize * @param namespaces The stack of namespaces * @param Locator The current Locator, if any * @param fUseDefault If true, qnames without prefixes will use the default namespace * @return The resulting vector of XalanQName instances. */ virtual const XalanQName** tokenizeQNames( size_type& count, const XalanDOMChar* qnameTokens, const NamespacesStackType& namespaces, const Locator* locator = 0, bool fUseDefault = false) = 0; /** * Create a stylesheet element for the provided type. The * instance owns the memory and will delete the element when * it goes out of scope and the containing stylesheet is * destroyed. * * @param token The enum value of the element to create. * @param stylesheetTree The stylesheet containing the element * @param atts The list of attributes for the element * @param locator The Locator instance for error reporting. May be 0. * * @return A pointer to the new instance. */ virtual ElemTemplateElement* createElement( int token, Stylesheet& stylesheetTree, const AttributeList& atts, const Locator* locator = 0) = 0; /** * Create a elements which have specific names. The instance * owns the memory and will delete the element when it goes * out of scope and the containing stylesheet is destroyed. * * @param token The enum value of the element to create. * @param stylesheetTree The stylesheet containing the element * @param name The name of the element * @param atts The list of attributes for the element * @param locator The Locator instance for error reporting. May be 0. * * @return A pointer to the new instance. */ virtual ElemTemplateElement* createElement( int token, Stylesheet& stylesheetTree, const XalanDOMChar* name, const AttributeList& atts, const Locator* locator = 0) = 0; /** * Create a an element for literal text. The instance owns the * memory and will delete the element when it goes out of * scope and the containing stylesheet is destroyed. * * @param stylesheetTree The stylesheet containing the element * @param chars The pointer to character string for element * @param length length of the chars parameter. * @param preserveSpace true is space should be preserved * @param disableOutputEscaping true if output escaping should be disabled * @param locator The Locator instance for error reporting. May be 0. * * @return A pointer to the new instance. */ virtual ElemTemplateElement* createElement( Stylesheet& stylesheetTree, const XalanDOMChar* chars, XalanDOMString::size_type length, bool preserveSpace, bool disableOutputEscaping, const Locator* locator = 0) = 0; /** * Create an element to handle an extension element. The * instance owns the memory and will delete the element when * it goes out of scope and the containing stylesheet is * destroyed. * * @param stylesheetTree The stylesheet containing the element * @param name The name of the element * @param atts The list of attributes for the element * @param handler The handler for elements in the extension namespace * @param locator The Locator instance for error reporting. May be 0. * * @return A pointer to the new instance. */ virtual ElemTemplateElement* createElement( Stylesheet& stylesheetTree, const XalanDOMChar* name, const AttributeList& atts, ExtensionNSHandler& handler, const Locator* locator = 0) = 0; /** * Create an instance of XalanMatchPatternData, which describes * data related to a match pattern and template in stylesheet. * The instance owns the memory and will delete the element when * it goes out of scope and the containing stylesheet is * destroyed. * * @param theTemplate The ElemTemplate node that contains the template for this pattern * @param thePosition The position in the stylesheet * @param theTargetString The target string for match pattern * @param TheMatchPattern The match pattern * @param thePatternString the pattern string * @param thePriority The priority for the match pattern. * * @return A pointer to the new instance. */ virtual const XalanMatchPatternData* createXalanMatchPatternData( const ElemTemplate& theTemplate, size_type thePosition, const XalanDOMString& theTargetString, const XPath& theMatchPattern, const XalanDOMString& thePatternString, XPath::eMatchScore thePriority) = 0; }; } #endif // STYLESHEETCONSTRUCTIONCONTEXT_HEADER_GUARD_1357924680