blob: 61fc8b66b1c7a46515cfdbafe7aad89af0c345b4 [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/>.
*/
#if !defined(XALAN_KEYTABLE_HEADER_GUARD)
#define XALAN_KEYTABLE_HEADER_GUARD
/**
* $Id$
*
* $State$
*
* @author Myriam Midy (Myriam_Midy @lotus.com
*/
// Base include file. Must be first.
#include "XSLTDefinitions.hpp"
#include <map>
#include <vector>
#include <PlatformSupport/DOMStringHelper.hpp>
#include <XPath/MutableNodeRefList.hpp>
#include <XPath/XalanQNameByReference.hpp>
class KeyDeclaration;
class NodeRefListBase;
class PrefixResolver;
class StylesheetExecutionContext;
class XalanElement;
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:
#if defined(XALAN_NO_NAMESPACES)
typedef vector<KeyDeclaration> KeyDeclarationVectorType;
typedef map<XalanDOMString,
MutableNodeRefList,
less<XalanDOMString> > NodeListMapType;
typedef map<XalanQNameByReference,
NodeListMapType,
less<XalanQNameByReference> > KeysMapType;
#else
typedef std::vector<KeyDeclaration> KeyDeclarationVectorType;
typedef std::map<XalanDOMString,
MutableNodeRefList> NodeListMapType;
typedef std::map<XalanQNameByReference,
NodeListMapType> KeysMapType;
#endif
/**
* Build a keys table.
*
* @param doc owner document key (normally the same as
* startNode)
* @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* doc,
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 NodeRefListBase&
getNodeSetByKey(
const XalanQName& qname,
const XalanDOMString& ref) const;
/**
* Retrieve the document key. This table should only be used with contexts
* whose Document root matches this key.
*
* @return Node for document
*/
const XalanNode*
getDocKey() const
{
return m_docKey;
}
private:
/**
* Helper function to add a node to the list if not found.
*
* @param theNodeList the node list.
* @param theNode the node to add.
*/
static void
addIfNotFound(
MutableNodeRefList& theNodeList,
XalanNode* theNode);
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 XalanNode* 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;
};
#endif // XALAN_KEYTABLE_HEADER_GUARD