## Xalan-C++ API Documentation

### The Xalan C++ XSLT Processor Version 1.9

Main Page | Class Hierarchy | Alphabetical List | Class List | File List | Class Members | File Members | Related Pages

# Stylesheet.hpp

Go to the documentation of this file.

    00001 /*
    00002  * Copyright 1999-2004 The Apache Software Foundation.
    00003  *
    00004  * Licensed under the Apache License, Version 2.0 (the "License");
    00005  * you may not use this file except in compliance with the License.
    00006  * You may obtain a copy of the License at
    00007  *
    00008  *     http://www.apache.org/licenses/LICENSE-2.0
    00009  *
    00010  * Unless required by applicable law or agreed to in writing, software
    00011  * distributed under the License is distributed on an "AS IS" BASIS,
    00012  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
    00013  * See the License for the specific language governing permissions and
    00014  * limitations under the License.
    00015  */
    00016
    00017 #if !defined(XALAN_STYLESHEET_HEADER_GUARD)
    00018 #define XALAN_STYLESHEET_HEADER_GUARD
    00019
    00020
    00021
    00022 // Base include file.  Must be first.
    00023 #include "XSLTDefinitions.hpp"
    00024
    00025
    00026
    00027 #include <xalanc/XalanDOM/XalanNode.hpp>
    00028 #include <xalanc/XalanDOM/XalanDOMString.hpp>
    00029
    00030
    00031
    00032 #include <xalanc/Include/XalanVector.hpp>
    00033 #include <xalanc/Include/XalanMap.hpp>
    00034
    00035
    00036
    00037 #include <xalanc/PlatformSupport/PrefixResolver.hpp>
    00038
    00039
    00040
    00041 #include <xalanc/XPath/NameSpace.hpp>
    00042 #include <xalanc/XPath/XalanQNameByReference.hpp>
    00043 #include <xalanc/XPath/XPath.hpp>
    00044
    00045
    00046
    00047 #include <xalanc/XSLT/NamespacesHandler.hpp>
    00048 #include <xalanc/XSLT/KeyDeclaration.hpp>
    00049 #include <xalanc/XSLT/StylesheetConstructionContext.hpp>
    00050 #include <xalanc/XSLT/StylesheetExecutionContext.hpp>
    00051 #include <xalanc/XSLT/XalanSpaceNodeTester.hpp>
    00052
    00053
    00054
    00055 XALAN_CPP_NAMESPACE_BEGIN
    00056
    00057
    00058
    00059 class ExtensionNSHandler;
    00060 class XalanDecimalFormatSymbols;
    00061 class ElemDecimalFormat;
    00062 class ElemTemplate;
    00063 class ElemTemplateElement;
    00064 class ElemVariable;
    00065 class KeyTable;
    00066 class NodeRefListBase;
    00067 class PrefixResolver;
    00068 class StylesheetConstructionContext;
    00069 class StylesheetRoot;
    00070 class XalanMatchPatternData;
    00071 class XalanQName;
    00072 class XObject;
    00073 class StylesheetExecutionContext;
    00074
    00075
    00076 typedef XalanVector<const XalanMatchPatternData*>   PatternTableVectorTypeDecl;
    00077 XALAN_USES_MEMORY_MANAGER(PatternTableVectorTypeDecl)
    00078
    00079
    00080
    00084 class XALAN_XSLT_EXPORT Stylesheet : protected PrefixResolver
    00085 {
    00086
    00087 public:
    00088
    00089     typedef StylesheetConstructionContext::size_type        size_type;
    00090     typedef StylesheetExecutionContext::ParamVectorType     ParamVectorType;
    00091     typedef XalanQName::NamespaceVectorType                 NamespaceVectorType;
    00092     typedef XalanQName::NamespacesStackType                 NamespacesStackType;
    00093
    00094     typedef XalanVector<ElemVariable*>                  ElemVariableVectorType;
    00095     typedef XalanVector<KeyDeclaration>                 KeyDeclarationVectorType;
    00096     typedef XalanVector<Stylesheet*>                    StylesheetVectorType;
    00097     typedef XalanVector<XalanDOMString>                 URLStackType;
    00098     typedef XalanVector<ElemDecimalFormat*>             ElemDecimalFormatVectorType;
    00099     typedef XalanVector<XalanSpaceNodeTester>           WhitespaceElementsVectorType;
    00100     typedef PatternTableVectorTypeDecl                  PatternTableVectorType;
    00101
    00102     typedef  XalanMap<XalanDOMString, ExtensionNSHandler*>      ExtensionNamespacesMapType;
    00103
    00104     typedef  XalanMap<XalanQNameByReference,
    00105                          const ElemTemplate* >      ElemTemplateMapType;
    00106
    00107     typedef XalanMap<const XalanNode*, KeyTable* >  KeyTablesTableType;
    00108
    00109     typedef XalanMap<XalanDOMString, PatternTableVectorType> PatternTableMapType;
    00110
    00111     typedef StylesheetConstructionContext::GetAndReleaseCachedString    GetAndReleaseCachedString;
    00112
    00118     Stylesheet(
    00119             StylesheetRoot&                 root,
    00120             const XalanDOMString&           baseIdentifier,
    00121             StylesheetConstructionContext&  constructionContext);
    00122
    00123     virtual
    00124     ~Stylesheet();
    00125
    00126     static Stylesheet*
    00127     create(MemoryManagerType& theManager,
    00128             StylesheetRoot&                 root,
    00129             const XalanDOMString&           baseIdentifier,
    00130             StylesheetConstructionContext&  constructionContext);
    00131
    00132     MemoryManagerType&
    00133     getMemoryManager()
    00134     {
    00135         return m_elementPatternTable.getMemoryManager();
    00136     }
    00137
    00143     double
    00144     getXSLTVerDeclared() const
    00145     {
    00146         return m_XSLTVerDeclared;
    00147     }
    00148
    00154     void
    00155     setXSLTVerDeclared(double ver)
    00156     {
    00157         m_XSLTVerDeclared = ver;
    00158     }
    00159
    00165     const StylesheetRoot&
    00166     getStylesheetRoot() const
    00167     {
    00168         return m_stylesheetRoot;
    00169     }
    00170
    00176     StylesheetRoot&
    00177     getStylesheetRoot()
    00178     {
    00179         return m_stylesheetRoot;
    00180     }
    00181
    00187     const NamespacesStackType&
    00188     getNamespaces() const
    00189     {
    00190         return m_namespaces;
    00191     }
    00192
    00198     NamespacesStackType&
    00199     getNamespaces()
    00200     {
    00201         return m_namespaces;
    00202     }
    00203
    00204     const NamespacesHandler&
    00205     getNamespacesHandler() const
    00206     {
    00207         return m_namespacesHandler;
    00208     }
    00209
    00210     NamespacesHandler&
    00211     getNamespacesHandler()
    00212     {
    00213         return m_namespacesHandler;
    00214     }
    00215
    00221     const NamespaceVectorType&
    00222     getNamespaceDecls() const
    00223     {
    00224         return m_namespaceDecls;
    00225     }
    00226
    00232     NamespaceVectorType&
    00233     getNamespaceDecls()
    00234     {
    00235         return m_namespaceDecls;
    00236     }
    00237
    00243     void
    00244     setNamespaceDecls(const NamespaceVectorType& ns)
    00245     {
    00246         m_namespaceDecls = ns;
    00247     }
    00248
    00255     void
    00256     pushNamespaces(const AttributeListType&     atts);
    00257
    00261     void
    00262     popNamespaces()
    00263     {
    00264         assert(m_namespaces.empty() == false);
    00265
    00266         m_namespaces.pop_back();
    00267     }
    00268
    00269     void
    00270     addWhitespaceElement(const XalanSpaceNodeTester&    theTester);
    00271
    00275     virtual void
    00276     postConstruction(StylesheetConstructionContext&     constructionContext);
    00277
    00287     bool
    00288     isAttrOK(
    00289             const XalanDOMChar*             attrName,
    00290             const AttributeListType&        atts,
    00291             int                             which,
    00292             StylesheetConstructionContext&  constructionContext) const;
    00293
    00300     const XalanDOMString*
    00301     getNamespaceFromStack(const XalanDOMString&     nodeName,
    00302                             XalanDOMString&         theBuffer) const
    00303     {
    00304         return getNamespaceFromStack(c_wstr(nodeName), theBuffer);
    00305     }
    00306
    00313     const XalanDOMString*
    00314     getNamespaceFromStack(const XalanDOMChar*   nodeName,
    00315                             XalanDOMString&     theBuffer) const;
    00316
    00324     const XalanDOMString*
    00325     getNamespaceForPrefixFromStack(const XalanDOMString&    prefix) const
    00326     {
    00327         return XalanQName::getNamespaceForPrefix(m_namespaces, prefix);
    00328     }
    00329
    00337     const XalanDOMString*
    00338     getNamespaceForPrefixFromStack(const XalanDOMChar*  prefix) const
    00339     {
    00340         assert(prefix != 0);
    00341
    00342         return XalanQName::getNamespaceForPrefix(m_namespaces, (const XalanDOMChar*)prefix);
    00343     }
    00344
    00352     const XalanDOMString*
    00353     getNamespaceForPrefix(
    00354             const XalanDOMString&           prefix,
    00355             StylesheetConstructionContext&  constructionContext) const;
    00356
    00364     const XalanDOMString*
    00365     getNamespaceForPrefix(
    00366             const XalanDOMChar*             prefix,
    00367             StylesheetConstructionContext&  constructionContext) const;
    00368
    00376     void
    00377     processExcludeResultPrefixes(
    00378         StylesheetConstructionContext&  theConstructionContext,
    00379         const XalanDOMChar*             theValue)
    00380     {
    00381         m_namespacesHandler.processExcludeResultPrefixes(
    00382                 theConstructionContext,
    00383                 theValue,
    00384                 m_namespaces);
    00385     }
    00386
    00393     void
    00394     addTemplate(
    00395             ElemTemplate*                   theTemplate,
    00396             StylesheetConstructionContext&  constructionContext);
    00397
    00406     bool
    00407     getYesOrNo(
    00408             const XalanDOMChar*             aname,
    00409             const XalanDOMChar*             val,
    00410             StylesheetConstructionContext&  constructionContext) const;
    00411
    00417     const XalanDOMString&
    00418     getBaseIdentifier() const
    00419     {
    00420         return m_baseIdent;
    00421     }
    00422
    00431     const XalanDOMString&
    00432     getCurrentIncludeBaseIdentifier() const
    00433     {
    00434         return m_includeStack.empty() == true ? getBaseIdentifier() : m_includeStack.back();
    00435     }
    00436
    00444     void
    00445     processNSAliasElement(
    00446             const XalanDOMChar*             name,
    00447             const AttributeListType&        atts,
    00448             StylesheetConstructionContext&  constructionContext);
    00449
    00455     void
    00456     processDecimalFormatElement(
    00457             StylesheetConstructionContext&  constructionContext,
    00458             const AttributeListType&        atts,
    00459             const LocatorType*              locator = 0);
    00460
    00468     const XalanDecimalFormatSymbols*
    00469     getDecimalFormatSymbols(const XalanQName&   theQName) const;
    00470
    00476     void
    00477     addImport(Stylesheet*   theStylesheet)
    00478     {
    00479         m_imports.insert(m_imports.begin(), theStylesheet);
    00480     }
    00481
    00487     bool
    00488     isWrapperless() const
    00489     {
    00490         return m_isWrapperless;
    00491     }
    00492
    00493     ElemTemplateElement*
    00494     initWrapperless(
    00495             StylesheetConstructionContext&  constructionContext,
    00496             const LocatorType*              locator);
    00497
    00503     URLStackType&
    00504     getIncludeStack()
    00505     {
    00506         return m_includeStack;
    00507     }
    00508
    00517     void
    00518     processKeyElement(
    00519             const PrefixResolver&           nsContext,
    00520             const AttributeListType&        atts,
    00521             const LocatorType*              locator,
    00522             StylesheetConstructionContext&  constructionContext);
    00523
    00530     const ElemTemplate*
    00531     findNamedTemplate(const XalanQName&     qname) const;
    00532
    00541     const ElemTemplate*
    00542     findTemplate(
    00543             StylesheetExecutionContext&     executionContext,
    00544             XalanNode*                      targetNode) const
    00545     {
    00546         assert(targetNode != 0);
    00547
    00548         return findTemplate(
    00549                 executionContext,
    00550                 targetNode,
    00551                 targetNode->getNodeType(),
    00552                 s_emptyQName,
    00553                 false);
    00554     }
    00555
    00567     const ElemTemplate*
    00568     findTemplate(
    00569             StylesheetExecutionContext&     executionContext,
    00570             XalanNode*                      targetNode,
    00571             XalanNode::NodeType             targetNodeType,
    00572             const XalanQName&               mode,
    00573             bool                            onlyUseImports) const;
    00574
    00581     static void
    00582     addObjectIfNotFound(
    00583             const XalanMatchPatternData*    thePattern,
    00584             PatternTableVectorType&         theVector);
    00585
    00595     static void
    00596     addObjectIfNotFound(
    00597             const XalanMatchPatternData*    thePattern,
    00598             const XalanMatchPatternData*    theArray[],
    00599             unsigned int&                   theArraySize);
    00600
    00608     const PatternTableVectorType*
    00609     locateElementMatchPatternDataList(const XalanDOMString&     theName) const;
    00610
    00618     const PatternTableVectorType*
    00619     locateAttributeMatchPatternDataList(const XalanDOMString&   theName) const;
    00620
    00627     const PatternTableVectorType*
    00628     locateMatchPatternDataList(
    00629             const XalanNode&        theNode,
    00630             XalanNode::NodeType     targetNodeType) const;
    00631
    00640     void
    00641     processExtensionNamespace(
    00642             StylesheetConstructionContext&  theConstructionContext,
    00643             const XalanDOMString&           uri);
    00644
    00651     ExtensionNSHandler*
    00652     lookupExtensionNSHandler(const XalanDOMString&  uri) const
    00653     {
    00654         const ExtensionNamespacesMapType::const_iterator    it =
    00655           m_extensionNamespaces.find(uri);
    00656
    00657         return it == m_extensionNamespaces.end() ? 0 : (*it).second;
    00658     }
    00659
    00666     void
    00667     setTopLevelVariable(ElemVariable*   var)
    00668     {
    00669         m_topLevelVariables.push_back(var);
    00670     }
    00671
    00679     void
    00680     pushTopLevelVariables(
    00681             StylesheetExecutionContext&     executionContext,
    00682             const ParamVectorType&          topLevelParams) const;
    00683
    00684
    00685     // These interfaces are inherited from PrefixResolver...
    00686
    00687     virtual const XalanDOMString*
    00688     getNamespaceForPrefix(const XalanDOMString&     prefix) const;
    00689
    00690     virtual const XalanDOMString&
    00691     getURI() const;
    00692
    00693     const XalanDOMString&
    00694     getXSLTNamespaceURI() const
    00695     {
    00696         return m_XSLTNamespaceURI;
    00697     }
    00698
    00699     void
    00700     setXSLTNamespaceURI(const XalanDOMString&   theURI)
    00701     {
    00702         m_XSLTNamespaceURI = theURI;
    00703     }
    00704
    00705     const ElemTemplate*
    00706     getFirstTemplate() const
    00707     {
    00708         return m_firstTemplate;
    00709     }
    00710
    00711 protected:
    00712
    00716     StylesheetRoot&                     m_stylesheetRoot;
    00717
    00721     XalanDOMString                      m_baseIdent;
    00722
    00727     KeyDeclarationVectorType            m_keyDeclarations;
    00728
    00729     WhitespaceElementsVectorType        m_whitespaceElements;
    00730
    00731     static const XalanQNameByReference  s_emptyQName;
    00732
    00733 private:
    00734
    00735     // Not defined...
    00736     Stylesheet(const Stylesheet&);
    00737
    00738     Stylesheet&
    00739     operator=(const Stylesheet&);
    00740
    00741     bool
    00742     operator==(const Stylesheet&) const;
    00743
    00744
    00755     const ElemTemplate*
    00756     findTemplateInImports(
    00757             StylesheetExecutionContext&     executionContext,
    00758             XalanNode*                      targetNode,
    00759             XalanNode::NodeType             targetNodeType,
    00760             const XalanQName&               mode) const;
    00761
    00766     XalanDOMString                          m_XSLTNamespaceURI;
    00767
    00771     StylesheetVectorType                    m_imports;
    00772
    00773     StylesheetVectorType::size_type         m_importsSize;
    00774
    00778     NamespacesStackType                     m_namespaces;
    00779
    00784     NamespaceVectorType                     m_namespaceDecls;
    00785
    00790     bool                                    m_isWrapperless;
    00791
    00795     ExtensionNamespacesMapType              m_extensionNamespaces;
    00796
    00800     ElemTemplate*                           m_firstTemplate;
    00801
    00806     URLStackType                            m_includeStack;
    00807
    00813     ElemTemplateMapType                     m_namedTemplates;
    00814
    00818     ElemVariableVectorType                  m_topLevelVariables;
    00819
    00823     double                                  m_XSLTVerDeclared;
    00824
    00830     PatternTableMapType                         m_elementPatternTable;
    00831
    00832     const PatternTableMapType::const_iterator   m_elementPatternTableEnd;
    00833
    00834     PatternTableVectorType                      m_elementAnyPatternList;
    00835
    00841     PatternTableMapType                         m_attributePatternTable;
    00842
    00843     const PatternTableMapType::const_iterator   m_attributePatternTableEnd;
    00844
    00845     PatternTableVectorType                      m_attributeAnyPatternList;
    00846
    00850     PatternTableVectorType                  m_textPatternList;
    00851
    00852     PatternTableVectorType                  m_commentPatternList;
    00853
    00854     PatternTableVectorType                  m_rootPatternList;
    00855
    00856     PatternTableVectorType                  m_piPatternList;
    00857
    00861     PatternTableVectorType                  m_nodePatternList;
    00862
    00863     size_type                               m_patternCount;
    00864
    00865     ElemDecimalFormatVectorType             m_elemDecimalFormats;
    00866
    00867     NamespacesHandler                       m_namespacesHandler;
    00868
    00869     static const XalanDOMString             s_emptyString;
    00870 };
    00871
    00872
    00873
    00874 XALAN_CPP_NAMESPACE_END
    00875
    00876
    00877
    00878 #endif  // XALAN_STYLESHEET_HEADER_GUARD

Interpreting class diagrams

Doxygen and GraphViz are used to generate this API documentation from the Xalan-C header files.

Xalan-C++ XSLT Processor Version 1.9 Copyright © 1999-2004 The Apache Software Foundation. All Rights Reserved.