You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@xalan.apache.org by db...@locus.apache.org on 2000/11/27 20:46:39 UTC

cvs commit: xml-xalan/c/src/XPath QNameByReference.cpp QNameByReference.hpp QNameByValue.cpp QNameByValue.hpp QName.cpp QName.hpp

dbertoni    00/11/27 11:46:33

  Modified:    c/src/XPath QName.cpp QName.hpp
  Added:       c/src/XPath QNameByReference.cpp QNameByReference.hpp
                        QNameByValue.cpp QNameByValue.hpp
  Log:
  Made QName an abstract class, and provided two different implementations.
  
  Revision  Changes    Path
  1.13      +1 -145    xml-xalan/c/src/XPath/QName.cpp
  
  Index: QName.cpp
  ===================================================================
  RCS file: /home/cvs/xml-xalan/c/src/XPath/QName.cpp,v
  retrieving revision 1.12
  retrieving revision 1.13
  diff -u -r1.12 -r1.13
  --- QName.cpp	2000/11/02 01:45:58	1.12
  +++ QName.cpp	2000/11/27 19:46:21	1.13
  @@ -61,7 +61,6 @@
   
   #include <PlatformSupport/DOMStringHelper.hpp>
   #include <PlatformSupport/STLHelper.hpp>
  -#include <PlatformSupport/XSLException.hpp>
   #include <PlatformSupport/XalanUnicode.hpp>
   
   
  @@ -70,161 +69,18 @@
   
   
   
  -#include "ElementPrefixResolverProxy.hpp"
  -#include "PrefixResolver.hpp"
  -#include "XPathSupport.hpp"
  -
  -
  -
   const XalanDOMString	QName::s_emptyString;
   
   
  -
  -QName::QName() :
  -	m_namespace(),
  -	m_localpart()
  -{
  -}
  -
  -
  -
  -QName::QName(
  -			const XalanDOMString&	theNamespace,
  -			const XalanDOMString&	theLocalPart) :
  -	m_namespace(theNamespace),
  -	m_localpart(theLocalPart)
  -{
  -}
  -
  -
  -
  -QName::QName(
  -			const XalanDOMString&		qname,
  -			const NamespacesStackType&	namespaces) :
  -	m_namespace(),
  -	m_localpart()
  -{
  -	initialize(c_wstr(qname), namespaces);
  -}
  -
  -
  -
  -QName::QName(
  -			const XalanDOMChar*			qname,
  -			const NamespacesStackType&	namespaces) :
  -	m_namespace(),
  -	m_localpart()
  -{
  -	assert(qname != 0);
  -
  -	initialize(qname, namespaces);
  -}
  -
  -
   
  -QName::QName(
  -			const XalanDOMString&	qname,
  -			const XalanElement*		namespaceContext,
  -			const XPathEnvSupport&	envSupport,
  -			const XPathSupport& 	support) :
  -	m_namespace(),
  -	m_localpart()
  +QName::QName()
   {
  -	ElementPrefixResolverProxy	theProxy(namespaceContext, envSupport, support);
  -
  -	resolvePrefix(qname, theProxy);
  -}
  -
  -
  -
  -QName::QName(
  -			const XalanDOMString&	qname,
  -			const PrefixResolver&	theResolver) :
  -	m_namespace(),
  -	m_localpart()
  -{
  -	resolvePrefix(qname, theResolver);
   }
   
   
   
   QName::~QName()
   {
  -}
  -
  -
  -
  -bool
  -QName::equals(const QName&	theRHS) const
  -{
  -	return ::equals(m_localpart, theRHS.m_localpart) &&
  -		   ::equals(m_namespace, theRHS.m_namespace);
  -}
  -
  -
  -
  -void
  -QName::initialize(
  -			const XalanDOMChar*			qname,
  -			const NamespacesStackType&	namespaces)
  -{
  -	const unsigned int	indexOfNSSep = indexOf(qname, XalanUnicode::charColon);
  -
  -	if(indexOfNSSep < length(qname))
  -	{
  -		const XalanDOMString		prefix = substring(qname, 0, indexOfNSSep);
  -		if(::equals(prefix, DOMServices::s_XMLNamespace))
  -			return;
  -		m_namespace = getNamespaceForPrefix(namespaces, prefix);
  -		if(0 == length(m_namespace))
  -		{
  -			throw XSLException(TranscodeFromLocalCodePage("Prefix must resolve to a namespace: ") + prefix);
  -		}
  -		m_localpart =  substring(qname, indexOfNSSep + 1);
  -	}
  -	else
  -		m_localpart = qname;
  -}
  -
  -
  -
  -void
  -QName::resolvePrefix(
  -			const XalanDOMString&	qname,
  -			const PrefixResolver&	theResolver)
  -{
  -	const unsigned int	indexOfNSSep = indexOf(qname, XalanUnicode::charColon);
  -	const unsigned int	theLength = length(qname);
  -
  -	if(indexOfNSSep < theLength)
  -	{
  -		const XalanDOMString	prefix = substring(qname, 0, indexOfNSSep);
  -
  -		if(::equals(prefix, DOMServices::s_XMLString))
  -		{
  -			m_namespace = DOMServices::s_XMLNamespaceURI;
  -		}
  -		// The default namespace is not resolved.
  -		else if(::equals(prefix, DOMServices::s_XMLNamespace))
  -		{
  -			return;
  -		}
  -		else
  -		{
  -			m_namespace = theResolver.getNamespaceForPrefix(prefix);
  -		}  
  -
  -		if(0 == length(m_namespace))
  -		{
  -			throw XSLException(TranscodeFromLocalCodePage("Prefix must resolve to a namespace: ") + prefix);
  -		}
  -	}
  -	else
  -	{
  -		// $$$ ToDo: error or warning...
  -	}
  -
  -	m_localpart = indexOfNSSep == theLength ? qname : substring(qname, indexOfNSSep + 1);
   }
   
   
  
  
  
  1.11      +37 -96    xml-xalan/c/src/XPath/QName.hpp
  
  Index: QName.hpp
  ===================================================================
  RCS file: /home/cvs/xml-xalan/c/src/XPath/QName.hpp,v
  retrieving revision 1.10
  retrieving revision 1.11
  diff -u -r1.10 -r1.11
  --- QName.hpp	2000/11/02 01:45:59	1.10
  +++ QName.hpp	2000/11/27 19:46:23	1.11
  @@ -118,64 +118,7 @@
   	explicit
   	QName();
   
  -	/**
  -	 * Construct a QName, with the supplied namespace and local part.
  -	 *
  -	 * @param theNamespace namespace string
  -	 * @param theLocalPart local part string
  -	 */
  -	QName(
  -			const XalanDOMString&	theNamespace,
  -			const XalanDOMString&	theLocalPart);
  -
  -	/**
  -	 * Construct a QName from a string, resolving the prefix using the given
  -	 * namespace vector stack. The default namespace is not resolved.
  -	 *
  -	 * @param qname      QName string
  -	 * @param namespaces namespace vector stack to use
  -	 */
  -	QName(
  -			const XalanDOMString&		qname,
  -			const NamespacesStackType&	namespaces);
  -
  -	/**
  -	 * Construct a QName from a string, resolving the prefix using the given
  -	 * namespace vector stack. The default namespace is not resolved.
  -	 *
  -	 * @param qname      QName string
  -	 * @param namespaces namespace vector stack to use
  -	 */
  -	QName(
  -			const XalanDOMChar*			qname,
  -			const NamespacesStackType&	namespaces);
  -
  -	/**
  -	 * Construct a QName from a string, resolving the prefix using the given
  -	 * namespace context. The default namespace is not resolved.
  -	 *
  -	 * @param qname            QName string
  -	 * @param namespaceContext context object for namespace resolution
  -	 * @param envSupport       XPath environment support class instance
  -	 * @param support          XPath support class instance
  -	 */
  -	QName(
  -			const XalanDOMString&	qname,
  -			const XalanElement*		namespaceContext,
  -			const XPathEnvSupport&	envSupport,
  -			const XPathSupport&		support);
  -
  -	/**
  -	 * Construct a QName from a string, resolving the prefix using the given
  -	 * prefix resolver. The default namespace is not resolved.
  -	 *
  -	 * @param qname            QName string
  -	 * @param theResolver prefix resolver to use
  -	 */
  -	QName(
  -			const XalanDOMString&		qname,
  -			const PrefixResolver&	theResolver);
  -
  +	virtual
   	~QName();
   
   	/**
  @@ -183,31 +126,26 @@
   	 * 
   	 * @return local part string
   	 */
  -	const XalanDOMString&
  -	getLocalPart() const
  -	{
  -		return m_localpart;
  -	}
  +	virtual const XalanDOMString&
  +	getLocalPart() const = 0;
   
   	/**
   	 * Retrieve the namespace of qualified name.
   	 * 
   	 * @return namespace string
   	 */
  -	const XalanDOMString&
  -	getNamespace() const
  -	{
  -		return m_namespace;
  -	}
  +	virtual const XalanDOMString&
  +	getNamespace() const = 0;
   
   	/**
   	 * Whether the qualified name is empty.
   	 * 
   	 * @return true if namespace and local part are both empty
   	 */
  -	bool isEmpty() const
  +	bool
  +	isEmpty() const
   	{
  -		return (::isEmpty(m_namespace) && ::isEmpty(m_localpart));
  +		return ::isEmpty(getNamespace()) && ::isEmpty(getLocalPart());
   	}
   
   	/**
  @@ -218,19 +156,12 @@
   	 * @return true if namespace and local part are both empty
   	 */
   	bool
  -	equals(const QName&		theRHS) const;
  -
  -	/**
  -	 * Override equals and agree that we're equal if the passed object is a
  -	 * string and it matches the name of the arg.
  -	 * 
  -	 * @param theRHS namespace to compare
  -	 * @return true if namespace and local part are both empty
  -	 */
  -	bool
  -	operator==(const QName&		theRHS) const
  +	equals(const QName&		theRHS) const
   	{
  -		return equals(theRHS);
  +		// Note that we do not use our member variables here.  See
  +		// class QNameReference for details...
  +		return ::equals(getLocalPart(), theRHS.getLocalPart()) &&
  +			   ::equals(getNamespace(), theRHS.getNamespace());
   	}
   
   	/**
  @@ -287,24 +218,30 @@
   			const XalanDOMString&		uri,
   			bool						reverse = true);
   
  -private:
  +protected:
   
  -	void
  -	initialize(
  -			const XalanDOMChar*			qname,
  -			const NamespacesStackType&	namespaces);
  +	static const XalanDOMString		s_emptyString;
  +};
   
  -	void
  -	resolvePrefix(
  -			const XalanDOMString&	qname,
  -			const PrefixResolver&	theResolver);
   
  -	XalanDOMString	m_namespace;
   
  -	XalanDOMString	m_localpart;
  +inline bool
  +operator==(
  +			const QName&	theLHS,
  +			const QName&	theRHS)
  +{
  +	return theLHS.equals(theRHS);
  +}
   
  -	static const XalanDOMString		s_emptyString;
  -};
  +
  +
  +inline bool
  +operator!=(
  +			const QName&	theLHS,
  +			const QName&	theRHS)
  +{
  +	return !(theLHS == theRHS);
  +}
   
   
   
  @@ -314,13 +251,17 @@
   			const QName&	theRHS)
   {
   	if (theLHS.getNamespace() < theRHS.getNamespace())
  +	{
   		return true;
  -	else if (equals( theLHS.getNamespace(), theRHS.getNamespace()))
  +	}
  +	else if (equals(theLHS.getNamespace(), theRHS.getNamespace()))
   	{
   		return theLHS.getLocalPart() < theRHS.getLocalPart();
   	}
   	else
  +	{
   		return false;
  +	}
   }
   
   
  
  
  
  1.1                  xml-xalan/c/src/XPath/QNameByReference.cpp
  
  Index: QNameByReference.cpp
  ===================================================================
  /*
   * 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/>.
   */
  // Class header file...
  #include "QNameByReference.hpp"
  
  
  
  QNameByReference::QNameByReference() :
  	QName(),
  	m_namespace(s_emptyString),
  	m_localpart(s_emptyString)
  {
  }
  
  
  
  QNameByReference::QNameByReference(
  			const XalanDOMString&	theNamespace,
  			const XalanDOMString&	theLocalPart) :
  	QName(),
  	m_namespace(theNamespace),
  	m_localpart(theLocalPart)
  {
  }
  
  
  
  QNameByReference::~QNameByReference()
  {
  }
  
  
  
  const XalanDOMString&
  QNameByReference::getLocalPart() const
  {
  	return m_localpart;
  }
  
  
  
  const XalanDOMString&
  QNameByReference::getNamespace() const
  {
  	return m_namespace;
  }
  
  
  
  1.1                  xml-xalan/c/src/XPath/QNameByReference.hpp
  
  Index: QNameByReference.hpp
  ===================================================================
  /*
   * 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(QNAMEBYREFERENCE_HEADER_GUARD_1357924680)
  #define QNAMEBYREFERENCE_HEADER_GUARD_1357924680
  
  
  
  // Base header file.  Must be first.
  #include <XPath/XPathDefinitions.hpp>
  
  
  
  // Base class header file...
  #include <XPath/QName.hpp>
  
  
  
  class XALAN_XPATH_EXPORT QNameByReference : public QName
  {
  public:
  
  	/**
  	 * Construct an empty QNameByReference.
  	 */
  	explicit
  	QNameByReference();
  
  	/**
  	 * Construct a QNameByReference, with the supplied namespace and local part.
  	 * The instance keeps only a _reference_ to the string, to avoid making a
  	 * copy.
  	 * @param theNamespace namespace string
  	 * @param theLocalPart local part string
  	 */
  	QNameByReference(
  			const XalanDOMString&	theNamespace,
  			const XalanDOMString&	theLocalPart);
  
  	virtual
  	~QNameByReference();
  
  	/**
  	 * Retrieve the local part of qualified name.
  	 * 
  	 * @return local part string
  	 */
  	virtual const XalanDOMString&
  	getLocalPart() const;
  
  	/**
  	 * Retrieve the namespace of qualified name.
  	 * 
  	 * @return namespace string
  	 */
  	virtual const XalanDOMString&
  	getNamespace() const;
  
  private:
  
  	const XalanDOMString&	m_namespace;
  
  	const XalanDOMString&	m_localpart;
  };
  
  
  
  #endif	// QNAMEBYREFERENCE_HEADER_GUARD_1357924680
  
  
  
  1.1                  xml-xalan/c/src/XPath/QNameByValue.cpp
  
  Index: QNameByValue.cpp
  ===================================================================
  /*
   * 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/>.
   */
  // Class header file...
  #include "QNameByValue.hpp"
  
  
  
  #include <PlatformSupport/XSLException.hpp>
  
  
  
  #include <DOMSupport/DOMServices.hpp>
  
  
  
  #include "ElementPrefixResolverProxy.hpp"
  #include "PrefixResolver.hpp"
  #include "XPathSupport.hpp"
  
  
  
  QNameByValue::QNameByValue() :
  	QName(),
  	m_namespace(),
  	m_localpart()
  {
  }
  
  
  
  QNameByValue::QNameByValue(const QNameByValue&	theSource) :
  	QName(),
  	m_namespace(theSource.m_namespace),
  	m_localpart(theSource.m_localpart)
  {
  }
  
  
  
  QNameByValue::QNameByValue(const QName&		theSource) :
  	QName(),
  	m_namespace(theSource.getNamespace()),
  	m_localpart(theSource.getLocalPart())
  {
  }
  
  
  
  QNameByValue::QNameByValue(
  			const XalanDOMString&	theNamespace,
  			const XalanDOMString&	theLocalPart) :
  	QName(),
  	m_namespace(theNamespace),
  	m_localpart(theLocalPart)
  {
  }
  
  
  
  QNameByValue::QNameByValue(
  			const XalanDOMString&		qname,
  			const NamespacesStackType&	namespaces) :
  	m_namespace(),
  	m_localpart()
  {
  	initialize(c_wstr(qname), namespaces);
  }
  
  
  
  QNameByValue::QNameByValue(
  			const XalanDOMChar*			qname,
  			const NamespacesStackType&	namespaces) :
  	m_namespace(),
  	m_localpart()
  {
  	assert(qname != 0);
  
  	initialize(qname, namespaces);
  }
  
  
  
  QNameByValue::QNameByValue(
  			const XalanDOMString&	qname,
  			const XalanElement*		namespaceContext,
  			const XPathEnvSupport&	envSupport,
  			const XPathSupport& 	support) :
  	m_namespace(),
  	m_localpart()
  {
  	ElementPrefixResolverProxy	theProxy(namespaceContext, envSupport, support);
  
  	resolvePrefix(qname, theProxy);
  }
  
  
  
  QNameByValue::QNameByValue(
  			const XalanDOMString&	qname,
  			const PrefixResolver&	theResolver) :
  	m_namespace(),
  	m_localpart()
  {
  	resolvePrefix(qname, theResolver);
  }
  
  
  
  QNameByValue::~QNameByValue()
  {
  }
  
  
  
  const XalanDOMString&
  QNameByValue::getLocalPart() const
  {
  	return m_localpart;
  }
  
  
  
  const XalanDOMString&
  QNameByValue::getNamespace() const
  {
  	return m_namespace;
  }
  
  
  
  void
  QNameByValue::initialize(
  			const XalanDOMChar*			qname,
  			const NamespacesStackType&	namespaces)
  {
  	const unsigned int	indexOfNSSep = indexOf(qname, XalanUnicode::charColon);
  
  	if(indexOfNSSep < length(qname))
  	{
  		const XalanDOMString		prefix = substring(qname, 0, indexOfNSSep);
  
  		if(::equals(prefix, DOMServices::s_XMLNamespace))
  			return;
  
  		m_namespace = getNamespaceForPrefix(namespaces, prefix);
  
  		if(0 == length(m_namespace))
  		{
  			throw XSLException(TranscodeFromLocalCodePage("Prefix must resolve to a namespace: ") + prefix);
  		}
  
  		m_localpart =  substring(qname, indexOfNSSep + 1);
  	}
  	else
  	{
  		m_localpart = qname;
  	}
  }
  
  
  
  void
  QNameByValue::resolvePrefix(
  			const XalanDOMString&	qname,
  			const PrefixResolver&	theResolver)
  {
  	const unsigned int	indexOfNSSep = indexOf(qname, XalanUnicode::charColon);
  	const unsigned int	theLength = length(qname);
  
  	if(indexOfNSSep < theLength)
  	{
  		const XalanDOMString	prefix = substring(qname, 0, indexOfNSSep);
  
  		if(::equals(prefix, DOMServices::s_XMLString))
  		{
  			m_namespace = DOMServices::s_XMLNamespaceURI;
  		}
  		// The default namespace is not resolved.
  		else if(::equals(prefix, DOMServices::s_XMLNamespace))
  		{
  			return;
  		}
  		else
  		{
  			m_namespace = theResolver.getNamespaceForPrefix(prefix);
  		}  
  
  		if(0 == length(m_namespace))
  		{
  			throw XSLException(TranscodeFromLocalCodePage("Prefix must resolve to a namespace: ") + prefix);
  		}
  	}
  	else
  	{
  		// $$$ ToDo: error or warning...
  	}
  
  	m_localpart = indexOfNSSep == theLength ? qname : substring(qname, indexOfNSSep + 1);
  }
  
  
  
  1.1                  xml-xalan/c/src/XPath/QNameByValue.hpp
  
  Index: QNameByValue.hpp
  ===================================================================
  /*
   * 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(QNAMEBYVALUE_HEADER_GUARD_1357924680)
  #define QNAMEBYVALUE_HEADER_GUARD_1357924680
  
  
  
  // Base header file.  Must be first.
  #include <XPath/XPathDefinitions.hpp>
  
  
  
  // Base class header file...
  #include <XPath/QName.hpp>
  
  
  
  class XALAN_XPATH_EXPORT QNameByValue : public QName
  {
  public:
  
  	/**
  	 * Construct an empty QNameByValue.
  	 */
  	explicit
  	QNameByValue();
  
  	/**
  	 * Copy constructor.
  	 *
  	 * @param theSource The source of the copy.
  	 */
  	QNameByValue(const QNameByValue&	theSource);
  
  	/**
  	 * Construct an instance from another QName.
  	 *
  	 * @param theSource The source of the copy.
  	 */
  	QNameByValue(const QName&	theSource);
  
  	/**
  	 * Construct a QNameByValue, with the supplied namespace and local part.
  	 *
  	 * @param theNamespace namespace string
  	 * @param theLocalPart local part string
  	 */
  	QNameByValue(
  			const XalanDOMString&	theNamespace,
  			const XalanDOMString&	theLocalPart);
  
  	/**
  	 * Construct a QNameByValue from a string, resolving the prefix using the given
  	 * namespace vector stack. The default namespace is not resolved.
  	 *
  	 * @param qname      QName string
  	 * @param namespaces namespace vector stack to use
  	 */
  	QNameByValue(
  			const XalanDOMString&		qname,
  			const NamespacesStackType&	namespaces);
  
  	/**
  	 * Construct a QNameByValue from a string, resolving the prefix using the given
  	 * namespace vector stack. The default namespace is not resolved.
  	 *
  	 * @param qname      QName string
  	 * @param namespaces namespace vector stack to use
  	 */
  	QNameByValue(
  			const XalanDOMChar*			qname,
  			const NamespacesStackType&	namespaces);
  
  	/**
  	 * Construct a QNameByValue from a string, resolving the prefix using the given
  	 * namespace context. The default namespace is not resolved.
  	 *
  	 * @param qname            QName string
  	 * @param namespaceContext context object for namespace resolution
  	 * @param envSupport       XPath environment support class instance
  	 * @param support          XPath support class instance
  	 */
  	QNameByValue(
  			const XalanDOMString&	qname,
  			const XalanElement*		namespaceContext,
  			const XPathEnvSupport&	envSupport,
  			const XPathSupport&		support);
  
  	/**
  	 * Construct a QNameByValue from a string, resolving the prefix using the given
  	 * prefix resolver. The default namespace is not resolved.
  	 *
  	 * @param qname            QName string
  	 * @param theResolver prefix resolver to use
  	 */
  	QNameByValue(
  			const XalanDOMString&	qname,
  			const PrefixResolver&	theResolver);
  
  	virtual
  	~QNameByValue();
  
  	/**
  	 * Retrieve the local part of qualified name.
  	 * 
  	 * @return local part string
  	 */
  	virtual const XalanDOMString&
  	getLocalPart() const;
  
  	/**
  	 * Retrieve the namespace of qualified name.
  	 * 
  	 * @return namespace string
  	 */
  	virtual const XalanDOMString&
  	getNamespace() const;
  
  private:
  
  	void
  	initialize(
  			const XalanDOMChar*			qname,
  			const NamespacesStackType&	namespaces);
  
  	void
  	resolvePrefix(
  			const XalanDOMString&	qname,
  			const PrefixResolver&	theResolver);
  
  	XalanDOMString	m_namespace;
  
  	XalanDOMString	m_localpart;
  };
  
  
  
  #endif	// QNAMEBYVALUE_HEADER_GUARD_1357924680