blob: 84212ec70b68a3721b724563c0d116abe83e724c [file] [log] [blame]
/*
* Copyright 1999-2004 The Apache Software Foundation.
*
* Licensed 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(XALAN_KEYTABLE_HEADER_GUARD)
#define XALAN_KEYTABLE_HEADER_GUARD
/**
* $Id$
*
* $State$
*
*/
// Base include file. Must be first.
#include "XSLTDefinitions.hpp"
#include <xalanc/Include/XalanVector.hpp>
#include <xalanc/Include/XalanMap.hpp>
#include <xalanc/PlatformSupport/DOMStringHelper.hpp>
#include <xalanc/XPath/MutableNodeRefList.hpp>
#include <xalanc/XPath/XalanQNameByReference.hpp>
XALAN_CPP_NAMESPACE_BEGIN
class KeyDeclaration;
class NodeRefListBase;
class PrefixResolver;
class StylesheetExecutionContext;
class XalanElement;
class XalanDocument;
class XalanNode;
/**
* Table of element keys, keyed by document node. An instance of this
* class is keyed by a Document node that should be matched with the
* root of the current context. It contains a table of name mappings
* to tables that contain mappings of identifier values to nodes.
*/
class KeyTable
{
public:
typedef XalanVector<KeyDeclaration> KeyDeclarationVectorType;
typedef XalanMap<XalanDOMString,
MutableNodeRefList> NodeListMapType;
typedef XalanMap<XalanQNameByReference,
NodeListMapType > KeysMapType;
/**
* Build a keys table.
*
* @param startNode node to start iterating from to build the keys
* index
* @param nscontext stylesheet's namespace context
* @param keyDeclarations stylesheet's xsl:key declarations
* @param executionContext current execution context
*/
KeyTable(
XalanNode* startNode,
const PrefixResolver& resolver,
const KeyDeclarationVectorType& keyDeclarations,
StylesheetExecutionContext& executionContext);
virtual
~KeyTable();
/**
* Given a valid element key, return the corresponding node list. If the
* name was not declared with xsl:key, this will return null, the
* identifier is not found, it will return an empty node set, otherwise it
* will return a nodeset of nodes.
*
* @param name name of the key, which must match the 'name' attribute on
* xsl:key
* @param ref value that must match the value found by the 'match'
* attribute on xsl:key
* @return pointer to nodeset for key
*/
const MutableNodeRefList&
getNodeSetByKey(
const XalanQName& qname,
const XalanDOMString& ref) const;
private:
static void
processKeyDeclaration(
KeysMapType& theKeys,
const KeyDeclaration& kd,
XalanNode* testNode,
const PrefixResolver& resolver,
StylesheetExecutionContext& executionContext);
/**
* The document key. This table should only be used with contexts
* whose Document roots match this key.
*/
const XalanDocument* m_docKey;
/**
* Table of element keys. The table will be built on demand,
* when a key is requested, or set by the XMLParserLiaison or
* the caller. The table is:
* 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.
*/
KeysMapType m_keys;
static const MutableNodeRefList s_dummyList;
};
XALAN_CPP_NAMESPACE_END
#endif // XALAN_KEYTABLE_HEADER_GUARD